“Where”命令成功代码的语法

“Where”命令成功代码的语法

运行“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%

相关内容