【问题标题】:How to start cmd batch loop in reversed order? (with the last directory)如何以相反的顺序启动cmd批处理循环? (与最后一个目录)
【发布时间】:2023-03-19 04:25:02
【问题描述】:

我的工作目录如下:

  • C:\Workdir\Dir1
  • C:\Workdir\Dir2
  • C:\Workdir\Dir3

我正在使用这个循环启动一个批处理文件:

for /D %%a in (*) do (

然后我的实际命令一个接一个地处理每个目录。 但我需要开始逆向前进。从最后一个目录开始,然后向上工作。从 Dir3 开始,然后是 Dir2,然后是 Dir1 我该怎么做?

【问题讨论】:

  • 你试着解释一下是什么决定了'最后一个目录'
  • 我的问题没有解释吗?最后我的意思是最后一个根据 windows shell 自然排序顺序

标签: loops batch-file


【解决方案1】:

您应该使用“for /f”循环,然后通过“dir”命令以相反的顺序列出所有文件夹。

@echo off
for /f "tokens=*" %%G in ('dir /s /b /A:D /O:-N "%CD%"') do (
    echo %%G
)

地点:

【讨论】:

  • 感谢您的帮助:) 我不得不修复批处理文件的其他行并将以下“%%a”替换为“%%~na”以不使用 %%a 的完整路径。但现在一切正常
  • 不需要"%CD%"dir 命令默认列出当前目录中的文件。 OP 没有请求 /s 开关,它列出了树中直到最后一层的所有文件。
【解决方案2】:

正如您指出的反向 Windows shell 自然排序顺序一样,您需要注意超过一位数的数字会导致您出现问题,而无需额外工作。

它会这样排序:

Dir9
Dir8
Dir7
Dir6
Dir5
Dir4
Dir3
Dir2
Dir11
Dir10
Dir1

为了解决这种疯狂,我建议的额外工作是使用 powershell:

@Echo Off
For /F "Delims=" %%A In ('
    PowerShell -C "Get-ChildItem | ?{ $_.PSIsContainer } | Select-Object -Expand Name | Sort-Object { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) } -Descending"
') Do Echo %%A
Pause

【讨论】:

  • 是的,好点;如果需要使用自然 Windows shell 排序顺序(不存在 Powershell),可以通过将文件夹重命名为 Dir01、Dir02、Dir03 等来解决此问题。
  • 您能告诉我您的脚本如何获取所有目录名称、解析数字序列、0 填充它们、重命名它们然后倒序排列吗?
  • @Compo 我认为他的意思是我可能想要手动对我的文件夹进行预排序以适应排序机制。我已经意识到了这种疯狂,所以我已经用前导零等进行了排序。但我仍然想了解 powershell 部分是如何工作的。它到底是做什么的。谢谢大家
  • 在这种情况下,为什么不将目录重命名为 DirZ、DirY、DirX。 Powershell 部分获取目录名称并按照您要求的方式对它们进行排序。虽然这里的许多人很乐意担任导师,但不幸的是我不是。我希望这不会冒犯你,因为那不是我的本意。
  • 没什么大不了的。它做它做的事。没关系,和平
猜你喜欢
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多