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



我正在测试一个文件夹的存在,并且根据它的存在,我想运行不同的命令:

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

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

The system cannot find the file specified.

我想显示正确的输出而不会出错。

这个怎么样:

DIR %MYDIR%tmp > nul 2>&1

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

"2>"用于重定向标准错误(描述符 2)。 因此,"2>&1"用于将标准错误重定向到标准输出(描述符 1 - 因此"> null 和 1> null 相同)。 或者,您可以使用"2> nul"。

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

MYDIR 环境变量的值中可能有一个空格。 当路径中有空格时,大多数命令将其视为多个参数,因为空格用于分隔参数。 因此,在您的情况下,如果 MYDIR C:Documents and SettingsJimMy 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. 确保启用命令扩展。 命令扩展很好

如果您想通过在 Batch 中编写复杂而有用的脚本(一项曾经被认为不可能完成的任务)来给您的朋友留下深刻印象,请仔细阅读并浏览有关以下每个命令的嵌入式文档:

  • 如果
  • 设置
  • 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%

这是我写你的脚本的方式

@echo off
setlocal EnableExtensions
if exist "%MyDir%tmp" (
    echo Folder exists
) else (
    echo Folder does not exist
)

祝你好运,狩猎愉快。

改用exist

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

最新更新