@echo off
cd C:\test 2>nul || exit /b 1
for /d %%a in (*) do (
echo [test]>"%%a\test.txt"
>>"%%a\test.txt" echo %%a
)
Если C:\test
не существует, то cd
сообщит об ошибке в stderr путь не найден . Вы можете отключить сообщение об ошибке, перенаправив stderr на nul с помощью 2>nul
. 2
- это поток stderr.
Поскольку cd
важен для следующего кода в сценарии, используйте ||
, что в случае неудачи предыдущей команды, выполните команду, следуя этой команде, с exit /b 1
.
Кроме того, чтобы избежать запаздывания с эхом в файл, вы можете поместить перенаправление перед командой эха, а не после, например, >>"%%a\test.txt" echo %%a
.
Или, например, из комментария:
@echo off
set "Source=C:\test"
set "Target=D:\data"
cd "%Source%" 2>nul || exit /b 1
if not exist "%Target%" exit /b 2
for /d %%a in (*) do (
> "%Target%\%%a\test.txt" echo [test]
>> "%Target%\%%a\test.txt" echo %%a
)
pause
exit
Источник обрабатывается ошибкой cd
, а цель обрабатывается if not exist
. Так что если Target не существует, exit /b 2
, так как продолжение сценария нецелесообразно. Таким образом, вы можете проверить errorlevel
1 или 2 на наличие сбоя скрипта, если он запущен, т. Е. Из командной строки.
Вот альтернатива, которая продолжается до конца скрипта:
@echo off
set "Source=C:\test"
set "Target=D:\data"
cd "%Source%" 2>nul && (
if exist "%Target%" (
for /d %%a in (*) do (
> "%Target%\%%a\test.txt" echo [test]
>> "%Target%\%%a\test.txt" echo %%a
)
)
)
pause
exit
Заметьте, я изменил ||
на &&
, чтобы теперь указывать условие успеха вместо отказа.
Goto может помочь прогрессу, чтобы избежать блоков в скобках:
@echo off
set "Source=C:\test"
set "Target=D:\data"
cd "%Source%" 2>nul || goto :step2
if not exist "%Target%" goto :step2
for /d %%a in (*) do (
> "%Target%\%%a\test.txt" echo [test]
>> "%Target%\%%a\test.txt" echo %%a
)
:step2
rem other code
pause
exit