Каков синтаксис для получения кода успеха при выполнении команды "Где"? Мне нужно, чтобы закончить цикл.

А какой синтаксис для получения каталога найденного файла?

Эта команда:

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: Я снял все, что мог. Создайте где-нибудь текстовый файл «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 ответ1

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.

Не спрашивайте, почему вы не можете просто сделать что-то вроде path = `где 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%

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .