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%