Как предотвратить вывод командного файла какой-либо ошибки? - PullRequest
1 голос
/ 05 марта 2020

Следующая команда выводит некоторую ошибку (например, " Указанный путь не найден " ...). Как я могу предотвратить отображение этой команды?

@echo off

cd C:\test
for /d %%a in (*) do (
    echo [test]>"%%a\test.txt"
    echo %%a >>"%%a\test.txt"
)

Любая помощь приветствуется.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 марта 2020
@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
0 голосов
/ 05 марта 2020

Запустите следующее, и оно должно помочь вам понять, что не так.

@echo off
setlocal

echo Starting script

echo Checking if directory exists
if exist "C:\test" (
    cd C:\test
    echo ... I found the Directory
    echo.
    echo Running loop
    for /d %%a in (*) do (
        echo.    Processing: "%%a"      
        echo [test]>"%%a\test.txt"
        echo %%a >>"%%a\test.txt"
    )
    echo ...Loop finished
) else (
    echo Whoops the directory "C:\test" does not exist
)
echo.
pause
...