Почему при работе батника не отображается результат поиска файла?

Написал батник который ищет путь к файлу Magneto.exe на всех дисках компьютера.
Указал чтоб батник искал до 600 секунд, если в течении 600 секунд ничего не нашел, то он сам закрывается.

После запуска батника, примерно через 20 секунд я вижу что в папке C:\Users\Administrator\AppData\Local\Temp появился пустой файл temp_search_results_23645.txt , и далее через примерно 10-15 секунд я вижу что в этот файл записался правильный результат , тот что мне и нужен: C:\Users\Administrator\Downloads\Magneto\Magneto\Magneto.exe

Батник сам закрылся после запуска через примерно 50 сек.

Почему в батнике не отображается путь к найденному файлу: C:\Users\Administrator\Downloads\Magneto\Magneto\Magneto.exe ?

Лог батника:
C:\Users\Administrator\Downloads>setlocal
C:\Users\Administrator\Downloads>set "searchID=23645"
C:\Users\Administrator\Downloads>set "tempfile=C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt"
C:\Users\Administrator\Downloads>set "flagfile=C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag"
C:\Users\Administrator\Downloads>start /b cmd /c "(for %D in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (dir /s /b "%D:\Magneto.exe" 2>nul >> "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt") && (echo Done > "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag"))"
C:\Users\Administrator\Downloads>set /a "timeout=600"
C:\Users\Administrator\Downloads>if exist "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag" (goto searchdone )
C:\Users\Administrator\Downloads>timeout /t 1 /nobreak  1>nul
C:\Users\Administrator\Downloads>(dir /s /b "C:\Magneto.exe"  2>nul 1>>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt" )  && (echo Done  1>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag" )
C:\Users\Administrator\Downloads>set /a "timeout-=1"
C:\Users\Administrator\Downloads>if !timeout! LEQ 0 (goto searchdone )
C:\Users\Administrator\Downloads>set "filepath="
C:\Users\Administrator\Downloads>if exist "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt" (for /F "delims=" %I in ('type "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt"') do (
set "filepath=%~dpI"
 goto filefound
) )
C:\Users\Administrator\Downloads>if defined filepath (echo Found Magneto.exe at: Magneto.exe )  else (echo File Magneto.exe not found after 600 seconds. )
File Magneto.exe not found after 600 seconds.
C:\Users\Administrator\Downloads>del "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt"  2>nul
C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt
C:\Users\Administrator\Downloads>del "C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag"  2>nul
C:\Users\Administrator\Downloads>endlocal
C:\Users\Administrator\Downloads>(dir /s /b "D:\Magneto.exe"  2>nul 1>>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt" )  && (echo Done  1>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag" )
C:\Users\Administrator\Downloads>(dir /s /b "E:\Magneto.exe"  2>nul 1>>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt" )  && (echo Done  1>"C:\Users\Administrator\AppData\Local\Temp\temp_search_results_23645.txt.flag" )


Код батника:
:: @echo off
setlocal

:: Создаем уникальный идентификатор для нашего процесса поиска
set "searchID=%random%"

:: Создаем временный файл для хранения результатов
set "tempfile=%temp%\temp_search_results_%searchID%.txt"
set "flagfile=%tempfile%.flag"

:: Запускаем поиск в фоновом режиме
start /b cmd /c "(for %%D in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (dir /s /b "%%D:\Magneto.exe" 2>nul >> "%tempfile%") && (echo Done > "%flagfile%"))"

:: Ожидаем завершения поиска или истечения таймера
set /a "timeout=600"

:waitloop
if exist "%flagfile%" (
    goto searchdone
)
timeout /t 1 /nobreak >nul
set /a "timeout-=1"
if !timeout! leq 0 (
    goto searchdone
)
goto waitloop

:searchdone
:: Проверяем, нашелся ли файл и извлекаем путь
set "filepath="
if exist "%tempfile%" (
    for /f "delims=" %%I in ('type "%tempfile%"') do (
        set "filepath=%%~dpI"
        goto filefound
    )
)

:filefound
if defined filepath (
    echo Found Magneto.exe at: %filepath%Magneto.exe
) else (
    echo File Magneto.exe not found after 600 seconds.
)

:: Очищаем временные файлы
del "%tempfile%" 2>nul
del "%flagfile%" 2>nul

endlocal
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
Если в файле что-то есть, то может быть ваш парсин неправильный?
Добавьте тут перед for
if exist "%tempfile%" (
    for /f "delims=" %%I in ('type "%tempfile%"') do (


type "%tempfile%"
посмотрите
Попробуйте его руками положить в файл и отпарсить в имя файла.

p.s. вместо этого всего, я бы просто воспользовался гнушным find... и быстрее и проще.. даже из того же bat можно вызывать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Попробуйте такой вариант цикла в searchdone: for /f "usebackq delims=" %%I in ("%tempfile%")

Согласен с pumpkinm, на счет выполнения вложенного cmd. Возможна ситуация, что на момент выполнения чтения файла с результатом, этот файл все еще захвачен процессом вложенного cmd и type не может его прочитать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы