重定向命令行输出以防止错误消息显示在命令窗口中

时间:2012-06-16 01:54:14

标签: windows redirect batch-file errorlevel

我正在测试文件夹是否存在,并且根据其存在,我想运行不同的命令:

DIR %MYDIR%\tmp > test.txt
IF ERRORLEVEL 1 (
      echo/FOLDER DOES NOT EXIST
) else (
      echo/FOLDER EXISTS
      )

问题是如果文件夹不存在,除了标准输出之外我还会收到此错误:

The system cannot find the file specified.

我想在不收到错误的情况下显示正确的输出。

3 个答案:

答案 0 :(得分:3)

这个怎么样:

DIR %MYDIR%\tmp > nul 2>&1

“> nul”表示将标准输出重定向到文件nul(位桶)。

“2>” 中用于重定向标准错误(描述符2)。所以“2>& 1”用于将标准错误重定向到意味着标准输出(描述符1 - 所以“> null和1> null是相同的)。或者你可以使用”2> NUL”。

答案 1 :(得分:2)

您可能遇到过我在自己的脚本中多次看到的常见问题:不期望文件路径中有空格。

MYDIR环境变量的值可能包含空格。当路径中有空格时,大多数命令将其视为多个参数,因为空格用于分隔参数。因此,如果MYDIR为C:\Documents and Settings\Jim\My Documents,那么您的脚本将尝试在多个参数上执行目录列表:

  • C:\文件
  • 设置\吉姆\我
  • 文档

在命令提示符下尝试:

C:\> mkdir learn

C:\> cd learn

C:\learn> mkdir peas and carrots

C:\learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:\learn

10/03/2012  07:26 PM    <DIR>          .
10/03/2012  07:26 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas

嗯,三个文件夹名为“豌豆”,“和”,“胡萝卜”,(按照我对dir命令的偏好按字母顺序排序)。要创建名称中包含空格的文件夹,必须在文件夹名称周围加上引号:

C:\learn> mkdir "peas and carrots"

C:\learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:\learn

10/03/2012  08:10 PM    <DIR>          .
10/03/2012  08:10 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas
10/03/2012  07:29 PM    <DIR>          peas and carrots
               0 File(s)              0 bytes
               6 Dir(s)  49,670,320,128 bytes free

要解决此问题,请在文件/文件夹路径周围添加引号:

DIR "%MYDIR%\tmp" > test.txt

即使文件存在存在问题,也会消除system cannot find the file specified

不幸的是,如果文件/文件夹确实不存在,您将收到相同的错误消息。如果您坚持使用DIR命令,则必须重定向stderr流。您已使用stdout重定向运算符重定向>。要将stderr重定向到同一文件,您的命令应如下所示:

DIR "%MYDIR%\tmp" > test.txt 2>&1

根据您的批处理文件的输出消息,我假设您只对确定%MYDIR%\ tmp是否存在感兴趣,并且您实际上并不希望将%MYDIR%\ tmp的目录列表保留在名为的文件中当前工作目录中的test.txt。如果您只是检查文件/文件夹是否存在,那么使用DIR命令是一个非常糟糕的选择。如果%MYDIR%\ tmp是一个文件夹,那么该脚本将浪费时间检索该文件夹中每个文件的目录信息。如果该文件夹中有数千个文件,则可能会导致明显的延迟。此外,您已经在当前工作目录中存放了一个名为test.txt的文件,您应该在脚本退出之前将其删除...您知道...假设您首先不想要该文件。

如果您只是想知道文件夹或文件是否存在,那么有一个更好的选择:if exist命令非常适合您的需求。要查找有关if命令的更多信息,请在Windows命令提示符窗口中键入:if /?

示例:

C:\> if /?
Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

乍一看,文档暗示if exist仅适用于文件,但请放心,它确实适用于文件夹和文件。

当您阅读if命令的文档时,您可能会遇到“如果启用了命令扩展...”这一短语在大多数系统上,默认情况下会启用命令扩展,但我仍然希望任何脚本setlocal EnableExtensions的第二行。第一行是@echo off,在我完成调试之前,它会快速更改为rem @echo off

setlocal EnableExtensions命令执行两项操作:

  1. 确保您在该脚本中设置或更改的任何环境变量都不会影响调用环境。
  2. 确保启用命令扩展。命令扩展很好
  3. 如果你想通过批量编写复杂而有用的脚本(一度被认为是不可能完成的任务)给你的朋友留下深刻印象,请仔细阅读并熟悉每个命令的嵌入式文档:

    • 如果
    • 设置
    • 致电
    • CMD

    你必须利用这些命令必须提供的每一个技巧和细微差别来编写非常好的脚本。

    例如:set命令可用于许多任务:

    1. 简单分配:
      set myDir=C:\Foo

    2. 表演数学:
      set /a myCount=myCount + 1

    3. 提示输入:
      set /p myColor=What is favorite color

    4. 提取子串:
      set myCentury=%myYear:~0,2%

    5. 以下是我编写脚本的方法

      @echo off
      setlocal EnableExtensions
      
      if exist "%MyDir%\tmp" (
          echo Folder exists
      ) else (
          echo Folder does not exist
      )
      
      祝你好运,狩猎快乐。

答案 2 :(得分:0)

改为使用exist

@echo off
if exist %MYDIR%\tmp (
  dir %MYDIR%\tmp > test.txt
  goto EndIt
)
echo %MYDIR%\tmp not found > test.txt
:EndIt