将FIND命令的输出保存到变量中

3

正如标题所说,我正在尝试从FIND命令的输出中提取并保存到变量中。具体来说,我正在使用:

DIR /b /s "C:\" | FIND "someexe.exe"

要定位一个特定的.exe文件,这似乎很顺利,但我想将FIND的结果保存下来以便稍后在同一脚本中使用。
我尝试了各种不同的调整方法:
for /f "usebackq" %%i in (`DIR /b /s "C:\" | FIND "someexe.exe"`) do SET foobar=%%i

但是当我尝试运行脚本时,命令窗口立即关闭(可能是由于某些错误,我尝试在下一行放置PAUSE命令,但无济于事)。
我认为这是我做错的一些愚蠢小事,但如果有人能告诉我是什么问题,我会很感激。只是为了进一步参考,我不关心“someexe.exe”有多少个副本,我只需要其中一个的路径。
1个回答

5
你应该会收到这个错误:| was unexpected at this time.。你当前的问题是未使用引号包括特殊字符,如|,当它们出现在FOR /F命令中时必须使用^进行转义。
for /f "usebackq" %%i in (`DIR /b /s "C:\" ^| FIND "someexe.exe"`) do SET foobar=%%i

看起来你是通过从桌面或Windows资源管理器双击运行批处理文件。这样做是可以的,但是在批处理终止后窗口会立即关闭。在你的情况下,由于语法错误,它在到达PAUSE之前就终止了。
我总是从命令窗口运行批处理文件:从开始菜单中找到“运行cmd.exe”。这将打开一个命令控制台。然后CD到批处理文件所在的目录,然后通过键入其名称(不需要扩展名)运行批处理文件。现在脚本终止后窗口保持打开状态。您可以使用SET检查变量,运行另一个脚本等操作。
在您的情况下没有必要使用FIND - DIR可以直接找到文件。此外,您的文件路径可能包含空格,在这种情况下它将被解析为标记。您需要设置“DELIMS =”或“TOKENS = *”,以便获得完整的路径。
我从来不明白为什么人们在执行命令时使用USEBACKQ。只有在我尝试使用FOR / F与文件并且由于空格和/或特殊字符而需要将文件括在引号中时,我才发现它有用。
此外,您可能会遇到由于无法访问的目录而导致的错误。将stderr重定向到nul可以清理输出。同样,>必须进行转义。
for /f "delims=" %%F in ('dir /b /s "c:\someexe.exe" 2^>nul') do set foobar=%%F

非常感谢!我从来不知道可以这样使用DIR,这绝对让事情变得更加简洁。 - mintchkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接