正如标题所说,我试图从 FIND 命令中获取输出并将其保存到一个变量中。具体来说,我正在使用:
DIR /b /s "C:\" | FIND "someexe.exe"
Run Code Online (Sandbox Code Playgroud)
找到一个特定的 .exe 文件,它似乎工作正常,但随后我想保存 FIND 的结果以供稍后在同一脚本中使用。
我尝试了各种不同的调整:
for /f "usebackq" %%i in (`DIR /b /s "C:\" | FIND "someexe.exe"`) do SET foobar=%%i
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行脚本时,命令窗口立即关闭(大概是由于某些错误,我尝试在下一行放置一个 PAUSE 命令但无济于事)。
我认为这是我做错的一些愚蠢的小事,但如果有人能告诉我它是什么,我会很感激。仅供参考,我不在乎存在多少个“someexe.exe”副本,我只需要其中一个的路径。
您应该收到此错误:| was unexpected at this time.。您的直接问题是未加引号的特殊字符,例如|必须^在 FOR /F ('command') 中出现时使用转义字符。
for /f "usebackq" %%i in (`DIR /b /s "C:\" ^| FIND "someexe.exe"`) do SET foobar=%%i
Run Code Online (Sandbox Code Playgroud)
听起来您正在通过从桌面或 Windows 资源管理器双击来运行批处理文件。这有效,但是在批处理终止后窗口立即关闭。在您的情况下,由于语法错误,它在到达 PAUSE 之前终止。
我总是从命令窗口运行我的批处理文件:从开始菜单你想要run cmd.exe. 这将打开一个命令控制台。然后 CD 到您的批处理文件所在的目录,然后通过键入其名称(不需要扩展名)来运行该批处理文件。现在窗口在脚本终止后保持打开状态。您可以使用 SET 检查变量,运行另一个脚本,等等。
在您的情况下无需使用 FIND - DIR 可以直接找到该文件。此外,您的文件路径可能包含空格,在这种情况下,它将被解析为标记。您需要设置“DELIMS=”或“TOKENS=*”,以便获得完整路径。
我一直不明白为什么人们在执行命令时使用 USBACKQ。我只在尝试对文件使用 FOR /F 时才发现它很有用,并且由于空格和/或特殊字符而需要将文件括在引号中。
此外,由于无法访问目录,您可能会遇到错误。将 stderr 重定向到 nul 会清理输出。再次,>必须逃脱。
for /f "delims=" %%F in ('dir /b /s "c:\someexe.exe" 2^>nul') do set foobar=%%F
Run Code Online (Sandbox Code Playgroud)