Windows 虚假的';system\cmd.exe';在FOR/F循环中

Windows 虚假的';system\cmd.exe';在FOR/F循环中,windows,for-loop,hidden,cmd,Windows,For Loop,Hidden,Cmd,每当我发现Windows/cmd外壳黑客需要“变通”时,这似乎是变得更加复杂的需求之一。基本上。。。我需要遍历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> )

每当我发现Windows/cmd外壳黑客需要“变通”时,这似乎是变得更加复杂的需求之一。基本上。。。我需要遍历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]
不幸的是,我也只能得到目标文件夹中的任何文件。我想这又和隐藏开关有关(/啊)

如何仅列出设置目录中的隐藏文件夹(而不是文件);然后像FOR命令一样迭代列表


提前感谢/Will

在批处理文件中
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,这将禁用整个批处理文件的命令echo。

您应该使用

for  /F "usebackq delims=*"  %f IN (`"dir /b /adh "%1" 2>NUL"`)  DO @echo. folder = "%f"
去做吧

2>NUL
将确保错误通道(如未找到文件)未显示并指向NULL(NUL)

将确保脚本也将工作,如果文件名有空格,因为文件名不能有一个“*”在其中,我们会找到他们所有

我希望这对你有用,对我的朋友有用

如果您这边发生了变化,我希望得到反馈,如果您不使用%f而是使用%a,我想知道为什么您的输出中会出现以下行

folder = C:\WINDOWS\system32\cmd.exe        <2>
folder=C:\WINDOWS\system32\cmd.exe
问候
PCFRANK

您好,谢谢您的评论。我很早就发现了这些要点。不幸的是,这些更改无助于解决问题。我从/aX命令中取出了空格。署长/啊。。。。不显示隐藏的文件或文件夹。主任/广告。。。。显示目录dir/adh和dir/ahd。。。。绝对不显示任何文件或目录。在FOR/F循环中的所有情况下,我都会在列表中得到一个虚假的$system/cmd.exe。我的主导@是经过深思熟虑的,15年前调试脚本时,我发现它对我很有帮助/w、 原谅我,这不是在隐瞒问题吗?现在我使用CALL:label结构和循环之类的东西。让我免于像这样的头痛。唉,我只是认为CMD语法是……对不起,但我认为答案是正确的。你可以实现你个人喜欢的事情,比如用标签打电话,但这并不能改变问题
for/F“usebackq delims=*%F IN(
“dir/s/b/a:dh”c:\“2>NUL”
)DO@echo。folder=“%f”
只起作用。它通过隐藏一致性的真正问题来起作用。相同指定/记录语义的两个版本给出了不同的答案。治疗方法是用猛击或鱼。自从我切换到Ubuntu,我的电脑就不会崩溃,像这样的简单脚本也能工作。
2>NUL
delims=*
folder = C:\WINDOWS\system32\cmd.exe        <2>