重定向命令行输出,以保持从指令窗口显示错误消息(Redirecting command-line o

2019-06-25 12:50发布

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

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

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

The system cannot find the file specified.

我想没有收到错误,以显示正确的输出。

Answer 1:

这个怎么样:

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

“> NUL”是指标准输出重定向到文件NUL(比特桶)。

“2>”用于重定向标准误差(描述符2)。 因此,“2>&1”用于重定向标准误差意味着标准输出(描述符1 - 那么“>零和1>空是是相同的)可替换地可以使用‘2> NUL’。



Answer 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. 确保命令扩展被启用。 命令扩展都不错

如果你想通过批量编写复杂的和有用的脚本(即在同一时间被认为是个任务是不可能的)来打动你的朋友,请仔细阅读和格罗克每个这些命令的嵌入式文件:

  • 如果
  • 呼叫
  • 对于
  • 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
)

祝你好运和快乐的狩猎。



Answer 3:

使用exist代替:

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


文章来源: Redirecting command-line output to keep error messages from showing in the command window