【问题标题】:How do I prevent a batch file from outputting any error?如何防止批处理文件输出任何错误?
【发布时间】:2020-03-05 07:38:54
【问题描述】:

以下命令输出一些错误(例如“找不到指定的路径”...)。 如何防止此命令显示任何内容?

@echo off

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

欢迎任何帮助。

谢谢

【问题讨论】:

    标签: windows for-loop batch-file output echo


    【解决方案1】:
    @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。您可以通过使用2>nul 将stderr 重定向到nul 来消除错误消息。 2 是标准错误流。

    由于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
    

    【讨论】:

    • 在以下示例中,如果 D:\data\%%a 不存在,我如何使错误消息静音:@echo off set Source=C:\test set Target=D:\data cd %Source% for /d %%a in (*) do ( >"%Target%\%%a\test.txt" echo [test] >>"%Target%\%%a\test.txt" echo %%a ) pause exit
    • 可以暂停脚本而不是退出脚本吗?
    • 您可以pause 甚至根据错误情况省略操作,尽管您确实需要根据源或目标或两者都不存在来选择脚本是否可以继续。这取决于您作为脚本的作者。
    • @echo off set "Source=C:\test" set "Target=D:\data" cd "%Source%" for /d %%a in (*) do ( > "%Target%\%%a\test.txt" echo [test] >> "%Target%\%%a\test.txt" echo %%a ) if not exist "%Target%\%%a" exit /b 2 echo done ! pause exit
    • 该脚本在满足 if 条件时退出。我们可以在不出现错误消息的情况下继续执行脚本吗?
    【解决方案2】:

    运行以下命令,它应该可以帮助您了解问题所在。

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多