这是其中一个似乎变得更复杂的要求,每当我发现需要“解决”的Windows / cmd shell hack时。基本上......我需要遍历DOS Shell FOR循环中的特定文件夹列表。这是我提出的循环:
echo ^ [start for test]
for /F "usebackq " %%f IN (`dir /b /adh "w:\sandbox\tmp\"`) DO (
echo ^ do with file: %%f
rem <do something>
)
echo ^ [for test done]
主要需要遍历源文件夹中的隐藏目录(sandbox \ tmp here)。
结果既令人惊讶又令人沮丧。这是在控制台命令行上使用此FOR指令的结果。
W:..> for /F "usebackq " %f
IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo ^ folder = %f
File Not Found <1>
folder = C:\WINDOWS\system32\cmd.exe <2>
folder = any <4>
folder = hidden-folder-01 <3>
folder = hidden-folder-02 <3>
folder = morph <4>
folder = practice-northwind <4>
其中列出了五个文件夹。大!标签上有一个 cmd.exe :&lt; 2 &gt;标签上的一个谜:&lt; 1 &gt;。我应该解释一下我认为的 DIR 开关。
我已经标注了输出,这是我到目前为止所做的工作。
dir /b /adh "w:\sandbox\tmp\"
)CMD行版本(或示例DOS脚本)的预期结果只是&lt; 3 &gt;项目
W:..> for /F "usebackq " %f
IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo ^ folder = %f
folder = hidden-folder-01 <3>
folder = hidden-folder-02 <3>
不幸的是,我'只能'获取目标文件夹中的任何文件。我认为这又与HIDDEN开关(/ ah)有关。
如何仅列出设置目录中的隐藏文件夹(而不是文件);并像FOR命令一样迭代列表?
提前致谢/ Will
答案 0 :(得分:2)
在批处理文件中,dir /b /a dh "w:\sandbox\tmp\"
应为dir /b /adh "w:\sandbox\tmp\"
,/ a和dh之间没有空格。使用空格,dir命令将dh解释为目录或文件paremer,并且是找不到文件错误的原因。
当您从命令行运行时,您正在使用与dir命令dir /b /ah /ad "w:\sandbox\tmp\"
不同的参数,因此您将获得不同的输出。使用/ ah和/ ad作为单独的参数dir似乎解释它应该显示目录或隐藏文件的东西,而/ adh将显示同时是目录和隐藏的东西。
此外,您不需要在所有线路上使用@。只是@echo在文件的顶部关闭,这将禁用整个批处理文件的命令回显。
答案 1 :(得分:1)
你应该使用
for /F "usebackq delims=*" %f IN (`"dir /b /adh "%1" 2>NUL"`) DO @echo. folder = "%f"
去做。
2>NUL
将确保未显示错误通道(例如,未找到文件)并指向NULL(NUL)
delims=*
如果文件名有空格,将确保脚本也能正常工作,因为文件名不能包含“*”,我们会找到它们全部!
我希望这对你有用,对我有用。
如果您的身边发生变化,我希望得到反馈,如果您不使用%f但使用%a,我知道为什么您的输出中会出现以下行
folder = C:\WINDOWS\system32\cmd.exe <2>
电贺 PCFreak