运行“Where”命令时获取成功代码的语法是什么?我需要它来结束循环。
获取找到的文件目录的语法是什么?
此命令:
其中/r“C:\Dir\Dir2 FindMe.txt”
在命令窗口中正确显示该文件:
C:\Dir1\Dir2\Dir3\FindMe.txt
但是现在我该怎么办?请多多包涵,我还不是新手。
编辑:我的问题类似于https://stackoverflow.com/questions/7562506,但在我的例子中,我要查找的文件不在直接路径中,而是向上、向下。以给出的示例为例,从同一目录开始,我的文件可能位于 C:\Temp\Dir1\Dir2\Dir3**\Dir14\Dir15**\FindMe.txt。这意味着我需要向上到 Dir3,在那里使用 WHERE 命令找到我的文件并停止循环。
编辑 2:我删除了所有能删除的内容。在某处创建一个 txt 文件“FindMe.txt”,将此代码剪切为 .cmd 放在其他地方,然后将另一个 .txt 文件拖到 .cmd 文件上。运气好的话,它应该会以 FindMe.txt 目录作为答案停止。我需要帮助的是伪代码:
@ECHO OFF
SET "cmdPath=%~dp0"
SET "cmdPath=%cmdPath:~0,-1%" ::without back slash
SET "searchPath=%cmdPath%" ::start search here
:loop
IF EXIST "%searchPath%\FindMe.txt" (
set "txtPath=%searchPath%
ECHO txtPath%searchPath%\FindMe.txt
GOTO :EOF
)
IF "%searchPath:~1%" == ":" (
ECHO FindMe.txt not found.
pause
GOTO :EOF
)
echo searchPath=%searchPath%
rem run: WHERE /r "%searchPath%" /q FindMe.txt
rem if successful (found) (
rem run: WHERE /r "%searchPath%" FindMe.txt
rem just keep the path and rename to txtPath
rem goto :eof
CALL :getPath "%searchPath%"
GOTO loop
:end
:getPath
SET "searchPath=%~dp1"
SET "searchPath=%searchPath:~0,-1%"
:end
:eof
答案1
要确定 where 命令是否成功,请在运行后调查 %errorlevel%:
c:\tmp>where x
c:\tmp\x
c:\tmp>echo %errorlevel%
0
c:\tmp>where y
INFO: Could not find files for the given pattern(s).
c:\tmp>echo %errorlevel%
1
要存储 find 命令的输出,您可以使用(但有多种方法):
c:\tmp>for /f %i in ('where cmd.exe') do @set ans=%i
c:\tmp>echo %ans%
C:\Windows\System32\cmd.exe
(例如,您还可以将输出通过管道传输到临时文件,然后读取临时文件。)
请注意,如果将其放入批处理文件中,则需要在 for 命令行中将 % 符号加倍。
还要注意,如果您多次执行此操作,比如在子程序中,如果没有找到文件,则不会设置“ans”(因为 for 循环没有任何迭代 - 如果这对您来说没有意义,请忽略它),所以您需要在使用 ans 之前检查错误级别。
还要注意,检查 for 循环后的错误级别不会告诉您有关 where 命令本身的任何信息。
不要问为什么你不能这样做路径=`其中 x`;因为我不知道。批处理脚本总是让我头疼。顺便说一句,如果你想在脚本编写方面取得进步,还有更强大的脚本语言可供选择。
这是一种完全不使用错误级别的方法。将下面的代码放入批处理文件中,并将 where 命令更改为您要查找的文件。但请保留“2> nul”部分,否则它会一直发出错误消息,提示您未找到该文件,直到找到该文件为止。
@echo off
REM set location to an empty string
set location=
REM set the command to run in a loop
set command="where testfile 2> nul"
REM simulating a while loop
:while1
REM running the command defined above and storing the result in the "location" variable.
REM Note: result will only be stored if a file was actually found. If not, the "set location" part is not executed.
for /f %%i in ('%command%') do @set location=%%i
if "%location%" == "" (
REM location is STILL an empty string like we set in the beginning; no file found
REM let's sleep for a second to not overload the system
timeout /t 1 > nul
REM ... and go back the :while tag
goto :while1
)
REM If we got to this point, a file was found, because location wasn't an empty string any more.
echo location: %location%