Sintaxe para o código de sucesso do comando “Where”

0

Qual é a sintaxe para obter um código de sucesso ao executar o comando "Where"? Eu preciso disso para terminar um loop.

E qual é a sintaxe para obter o diretório do arquivo encontrado?

Este comando:

WHERE / r "C: \ Dir \ FindMe.txt Dir2"

mostra corretamente o arquivo na janela de comando:

C: \ Dir1 \ Dir2 \ Dir3 \ FindMe.txt

Mas agora o que eu faço? Por favor, seja gentil, eu sou menos que um novato.

EDITAR: Minha pergunta é semelhante ao link , mas, no meu caso, o arquivo que estou procurando não está no caminho direto, mas sim acima, e depois para baixo. Tomando o exemplo dado, e começando no mesmo diretório, meu arquivo poderia estar em C: \ Temp \ Dir1 \ Dir2 \ Dir3 ** \ Dir14 \ Dir15 ** \ FindMe.txt. Significado Preciso ir até Dir3, lá encontrar meu arquivo com o comando WHERE e parar meu loop.

EDIT 2: eu tirei tudo que pude. Faça um arquivo txt "FindMe.txt" em algum lugar, coloque este código cortado como um .cmd em outro lugar e, em seguida, arraste outro arquivo .txt para o arquivo .cmd. Com alguma sorte, deve parar com o diretório FindMe.txt como resposta. O que eu preciso de ajuda é o pseudo código:

@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
    
por JuergenL 22.01.2015 / 00:22

1 resposta

1

Para descobrir se o comando where foi bem sucedido, investigue o% errorlevel% após a execução:

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

E para armazenar a saída do comando find, você pode usar (mas existem várias maneiras):

c:\tmp>for /f %i in ('where cmd.exe') do @set ans=%i

c:\tmp>echo %ans%
C:\Windows\System32\cmd.exe

(Você também pode enviar a saída para um arquivo temporário e ler o arquivo temporário, por exemplo).

Observe que, se você colocar isso em um arquivo de lote, precisará duplicar os sinais% na linha com o comando for.

Observe também que se você fizer isso várias vezes, digamos em uma sub-rotina, o 'ans' não será definido se não houver nenhum arquivo encontrado (porque o loop for não possui iterações - se isso não acontecer sentido para você apenas ignorá-lo), então você precisa verificar o errorlevel antes de usar o ans.

Observe também que a verificação do nível de erro após o loop for não informará nada sobre o comando where.

Não pergunte por que você não pode simplesmente fazer algo como caminho = 'onde x'; , porque não sei. E o script em lote sempre me dá dor de cabeça. Existem linguagens de script muito mais poderosas disponíveis, a propósito, se você quiser progredir no script.

Aqui está uma maneira que não usa o errorlevel. Coloque o código abaixo em um arquivo batch e altere o comando where para o arquivo que você está procurando. Deixe a parte "2 > nul" intacta, ou ela manterá as mensagens de erro cuspindo que o arquivo não foi encontrado até que o arquivo seja encontrado.

@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%
    
por 22.01.2015 / 01:09