我正在testing一个文件夹的存在,并根据它的存在,我想运行不同的命令:
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 Settings\Jim\My Documents
那么你的脚本将尝试执行一个目录列表几个参数:
在命令提示符下试试这个:
C:\> mkdir learn C:\> cd learn C:\> 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
exists命令完全适合您的需要。 要了解有关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
命令执行两件事情:
如果你想通过在Batch(一次被认为是不可能的任务)中编写复杂且有用的脚本来给你的朋友留下深刻的印象,请仔细阅读并仔细阅读每个命令的嵌入式文档:
你将不得不利用这些命令所提供的每一个技巧和细微差别来编写非常好的脚本。
例如: set
命令可以用于许多任务:
简单的任务:
set myDir=C:\Foo
表演数学:
set /a myCount=myCount + 1
提示输入:
set /p myColor=What is favorite color
提取子字符串:
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