据我所知,它.bat是旧的16位命名约定,.cmd适用于32位Windows,即从NT开始.但我继续在任何地方看到.bat文件,并且它们似乎使用任一后缀完全相同.假设我的代码将永远不需要对新台币任何旧的运行,是否真的重要走哪条路我名字我的批处理文件,还是有一些疑难杂症,通过使用错误的后缀等着我?
假设我们想要使用以下命令在Windows中创建一个空文件:
type nul > C:\does\not\exist\file.txt
Run Code Online (Sandbox Code Playgroud)
目录不存在,所以我们得到错误:
The system cannot find the path specified
Run Code Online (Sandbox Code Playgroud)
如果你打印%errorlevel%输出是:
echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)
但命令没有成功!
我注意到,%errorlevel%如果你使用重定向,窗口不会设置最后一个命令.
有没有解决的办法?
ERRORLEVEL是大多数cmd.exe命令在根据一系列条件结束更改时返回的值,因此知道命令返回的值是有助于编写更好的批处理文件的有用信息.所有外部.exe程序在结束时都会更改ERRORLEVEL(这是ExitProcess和TerminateProcess Win-32 API函数的固有机制),并且通常记录这些值,但内部 cmd.exe命令返回的值在其他地方没有完整记录.
此问题中出现具有部分ERRORLEVEL值的表,但仅适用于成功时设置ERRORLEVEL = 0的内部命令.我建议OP这样的问题修改它,以便也包括"不成功的命令"返回的值,但他拒绝并邀请我发布我自己的问题/答案,所以在这里!必须注意的是大于零的不同ERRORLEVEL并没有必然意味着该命令失败!有些命令以无错误结束并返回大于零的值以指示不同的"退出状态",包括内部命令(如SET /P).
为了更好地使用Batch .bat文件中的内置cmd.exe命令,我们需要知道它们返回的ERRORLEVEL值以及此管理中涉及的机制.所以问题是,哪个内部cmd.exe命令将ERRORLEVEL设置为任何值(包括零)?
有很多建议用于处理批处理文件中的返回代码(使用ERROLEVEL机制),例如
有些建议是做if errorlevel 1 goto somethingbad,而其他人建议使用
%ERRORLEVEL%变量和使用==,EQU,LSS等有似乎内的问题IF陈述和这样的,所以后来delayedexpansion鼓励,但它似乎来与自己的怪癖.
什么是万无一失(即健壮,所以它几乎可以在任何具有几乎任何返回码的系统上工作)的方式来知道是否返回了一个坏的(非零)代码?
对于基本用法,以下似乎可以正常捕获任何非零返回代码:
if not errorlevel 0 (
echo error level was nonzero
)
Run Code Online (Sandbox Code Playgroud) 在linux中我们有makefile:
$(foreach A,a b,echo $(A) &&) true
Run Code Online (Sandbox Code Playgroud)
它工作和回声
a
b
Run Code Online (Sandbox Code Playgroud)
现在我们想将它移植到Windows.我在Windows中发现的最短命令什么都不做:
if 0==1 0
Run Code Online (Sandbox Code Playgroud)
所以makefile示例看起来像
$(foreach A,a b,echo $(A) &&) if 0==1 0
Run Code Online (Sandbox Code Playgroud)
Windows中的框中是否有任何虚拟命令(实际上什么都不做)?还是任何好的黑客?
我正在编写批处理(.bat)脚本,我需要处理删除文件夹失败的情况.我正在使用%errorlevel%捕获退出代码,但在rd命令的情况下它似乎不起作用:
C:\Users\edo\Desktop>rd testdir
Directory is not empty
C:\Users\edo\Desktop>echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)
为什么?你有什么建议?
在重定向失败时(由于文件不存在或文件访问不足),ErrorLevel似乎没有设置该值(在以下示例中,文件test.tmp是写保护的,文件test.nil不存在):
>>> (call ) & rem // (reset `ErrorLevel`)
>>> > "test.tmp" echo Text
Access is denied.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
>>> (call ) & rem // (reset `ErrorLevel`)
>>> < "test.nil" set /P DUMMY=""
The system cannot find the file specified.
>>> echo ErrorLevel=%ErrorLevel%
ErrorLevel=0
Run Code Online (Sandbox Code Playgroud)
但是,只要失败的重定向后面跟着||查询退出代码的条件连接运算符,ErrorLevel就会1意外地设置为:
>>> (call ) & rem // (reset `ErrorLevel`)
>>> (> "test.tmp" echo Text) || echo Fail
Access is denied.
Fail
>>> …Run Code Online (Sandbox Code Playgroud) 我对它似乎应该是脚本的相当基本的部分有疑问。
ECHO !url1! >> !hostsfile! && ECHO Successfully added !url1! to file. || 2>&1>NUL && ECHO Unable to write !url1! to file. && GOTO :FAIL
Run Code Online (Sandbox Code Playgroud)
这是一个尝试将 URL 写入给定文件的条件,如果对该文件的访问被拒绝,则打印一条错误消息。不幸的是,CMD 也会生成自己的错误消息,因此目前,作为输出,我收到默认错误“访问被拒绝”,然后是我自己的“无法将 www.url.com 写入文件”。
我尝试过将默认错误消息通过管道传递给 NUL,但没有成功,但即使我阅读了所有内容,我对管道如何工作及其语法的了解仍然很少,而且我没有任何进展。
另外,顺便说一句:有没有什么方法可以将该行拆分为更易于管理而不导致错误?
尝试类似的东西:
ECHO !url1! >> !hostsfile! && ECHO Successfully added !url1! to Hosts file.
|| 2>&1>NUL && ECHO Unable to write !url1! to Hosts. && GOTO :FAIL
Run Code Online (Sandbox Code Playgroud)
或者
ECHO !url1! >> !hostsfile! && ECHO Successfully added !url1! to Hosts file. ||
2>&1>NUL && …Run Code Online (Sandbox Code Playgroud) 如何创建一个 DEL 命令未能正确执行的报告文件?
我原以为你会这样做:
DEL FILENAME.TXT ECHO "FILENAME.TXT" >> REPORT.TXT
Run Code Online (Sandbox Code Playgroud)
但它所做的只是创建一个空的报告文件,无论它是否找到 FILENAME.TXT。我想创建一个报告文件,如果它无法删除 FILENAME.TXT,无论出于何种原因,弹出的消息都会转储到 REPORT.TXT 中。
有任何想法吗?