相关疑难解决方法(0)

Windows批处理文件:.bat vs .cmd?

据我所知,它.bat是旧的16位命名约定,.cmd适用于32位Windows,即从NT开始.但我继续在任何地方看到.bat文件,并且它们似乎使用任一后缀完全相同.假设我的代码将永远不需要对新台币任何旧的运行,是否真的重要走哪条路我名字我的批处理文件,还是有一些疑难杂症,通过使用错误的后缀等着我?

windows cmd batch-file

715
推荐指数
8
解决办法
43万
查看次数

Windows中的文件重定向和%errorlevel%

假设我们想要使用以下命令在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%如果你使用重定向,窗口不会设置最后一个命令.

有没有解决的办法?

windows error-handling batch-file io-redirection

21
推荐指数
1
解决办法
6285
查看次数

内部cmd.exe命令设置的ERRORLEVEL值是什么?

ERRORLEVEL是大多数cmd.exe命令在根据一系列条件结束更改时返回的值,因此知道命令返回的值是有助于编写更好的批处理文件的有用信息.所有外部.exe程序在结束时都会更改ERRORLEVEL(这是ExitProcessTerminateProcess Win-32 API函数的固有机制),并且通常记录这些值,但内部 cmd.exe命令返回的值在其他地方没有完整记录.

此问题中出现具有部分ERRORLEVEL值的,但仅适用于成功时设置ERRORLEVEL = 0的内部命令.我建议OP这样的问题修改它,以便也包括"不成功的命令"返回的值,但他拒绝并邀请我发布我自己的问题/答案,所以在这里!必须注意的是大于零的不同ERRORLEVEL并没有必然意味着该命令失败!有些命令以无错误结束并返回大于零的值以指示不同的"退出状态",包括内部命令(如SET /P).

为了更好地使用Batch .bat文件中的内置cmd.exe命令,我们需要知道它们返回的ERRORLEVEL值以及此管理中涉及的机制.所以问题是,哪个内部cmd.exe命令将ERRORLEVEL设置为任何值(包括零)?

cmd batch-file errorlevel

21
推荐指数
1
解决办法
1万
查看次数

在Windows批处理文件中检查非零(错误)返回代码的万无一失的方法

介绍

有很多建议用于处理批处理文件中的返回代码(使用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)

windows batch-file

18
推荐指数
1
解决办法
3万
查看次数

Windows cmd中的虚拟命令

在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中的框中是否有任何虚拟命令(实际上什么都不做)?还是任何好的黑客?

windows cmd batch-file nop

17
推荐指数
4
解决办法
1万
查看次数

当删除失败时,"rd"退出并将errorlevel设置为0,等等

我正在编写批处理(.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)

为什么?你有什么建议?

windows error-handling cmd batch-file exit-code

13
推荐指数
2
解决办法
9728
查看次数

为什么ErrorLevel仅在||之后设置 操作员重定向失败?

在重定向失败时(由于文件不存在或文件访问不足),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)

windows cmd batch-file exit-code io-redirection

10
推荐指数
1
解决办法
666
查看次数

使用批处理进行条件编程 - 无法将 STDERR 定向到 NUL

我对它似乎应该是脚本的相当基本的部分有疑问。

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)

cmd batch-file

4
推荐指数
1
解决办法
727
查看次数

报告删除到 DEL 批处理文件中的文件失败

如何创建一个 DEL 命令未能正确执行的报告文件?

我原以为你会这样做:

DEL FILENAME.TXT ECHO "FILENAME.TXT" >> REPORT.TXT
Run Code Online (Sandbox Code Playgroud)

但它所做的只是创建一个空的报告文件,无论它是否找到 FILENAME.TXT。我想创建一个报告文件,如果它无法删除 FILENAME.TXT,无论出于何种原因,弹出的消息都会转储到 REPORT.TXT 中。

有任何想法吗?

batch-file echo delete-file

2
推荐指数
1
解决办法
1723
查看次数