Почему при работе батника не отображается результат поиска файла?
Написал батник который ищет путь к файлу Magneto.exe на всех дисках компьютера.
Указал чтоб батник искал до 600 секунд, если в течении 600 секунд ничего не нашел, то он сам закрывается. После запуска батника, примерно через 20 секунд я вижу что в папке C:\Users\Administrator\AppData\Local\Temp появился пустой файл temp_search_results_23645.txt , и далее через примерно 10-15 секунд я вижу что в этот файл записался правильный результат , тот что мне и нужен: C:\Users\Administrator\Downloads\Magneto\Magneto\M agneto.exe Батник сам закрылся после запуска через примерно 50 сек. Почему в батнике не отображается путь к найденному файлу: C:\Users\Administrator\Downloads\Magneto\Magneto\M agneto.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 |
>> Почему в батнике не отображается путь к найденному файлу
Потому что системная утилита start создает отдельный процесс никак ни связанный с батником. Для таких задач гораздо проще использовать PowerShell, WSH, C#, WQL. Лично я в юности использовал Autoit и PHP_win из за простоты и нулевого порога вхождения а сейчас обычно C# + WMI |
все спасибо . уже сам разобрался!
|
Часовой пояс GMT +3, время: 11:50. |