任何人都可以告诉我如何在Windows批处理脚本中执行以下操作?(*.bat):
更详细地说,我想创建一个VTS在C:\驱动器上命名的文件夹,但前提是该文件夹尚不存在.我不想覆盖文件夹的内容(如果它已经存在并且执行批处理).
我有一个批处理文件,它使用不同的参数反复调用相同的可执行文件.如果其中一个调用返回任何级别的错误代码,如何使其立即终止?
基本上,我想要相当于MSBuild的ContinueOnError=false.
我有一个批处理文件,可以自动将一堆文件从一个地方复制到另一个地方,然后返回给我.唯一的事情就是它帮助我,我不小心选择了命令缓冲区中的命令,并大量覆盖未经修改的更改.
我的.bat文件需要什么代码才能让它说"你确定",并让我在运行文件的其余部分之前输入"y"吗?如果输入"y"之外的任何内容,它应该退出该行的执行.
编辑 11月27日好的我再次标记这个未答复,因为我仍然无法弄明白.当我打电话给"退出"时 它关闭cmd.exe这不是我想要的.这一切都是因为Windows实现了命令缓冲区错误[不同于我至少习惯的]
我想知道是否有一种简单的方法可以在Windows批处理文件中执行分支,具体取决于单个表达式的值.类似于C,C++,C#,Java,JavaScript,PHP和其他真实编程语言中的switch/case块的东西.
我唯一的解决方法是一个简单的if/else块,其中重复检查相同的表达式是否与不同的值相等:
IF "%ID%"=="0" (
REM do something
) ELSE IF "%ID%"=="1" (
REM do something else
) ELSE IF "%ID%"=="2" (
REM do another thing
) ELSE (
REM default case...
)
Run Code Online (Sandbox Code Playgroud)
如此愚蠢.有更好的解决方案吗?
在Windows批处理脚本中处理错误的常用方法是使用
if errorlevel 1 ...或等if %errorlevel% neq 0 ....通常,人们希望错误处理代码保留ERRORLEVEL.
我相信所有外部命令总是会导致ERRORLEVEL被设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL.
但内部命令怎么样?问题是,一些内部命令在成功时将ERRORLEVEL清除为0,而有些则没有.而且我找不到任何指定哪些命令做什么的文档.
所以问题是,哪些内部命令成功后将ERRORLEVEL清除为0?这不是关于返回的ERRORLEVEL代码的一般问题,而是严格关于成功结果的问题.
有些帖子如何将ERRORLEVEL重置为零的最简单方法是什么?和Windows批处理文件:.bat vs .cmd?给出部分答案.但我从未见过全面的清单.
注意: 多年来我一直很好奇.所以我最终决定进行一系列实验并得出一个明确的答案.我发布此问答来分享我发现的内容.
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设置为任何值(包括零)?
我试着理解批处理文件中单个命令行中的多个命令是如何工作的.
dir & md folder1 & rename folder1 mainfolder
Run Code Online (Sandbox Code Playgroud)
和其他情况类似的命令,但&用&&.
dir && md folder1 && rename folder1 mainfolder
Run Code Online (Sandbox Code Playgroud)
1.这两种情况有什么区别?
我想问的其他事情:
单线batch.bat:
dir & md folder1 & rename folder1 mainfolder
Run Code Online (Sandbox Code Playgroud)
多线程batch.bat:
dir
md folder1
rename folder1 mainfolder
Run Code Online (Sandbox Code Playgroud)
2.这种单线程和多线程在批处理文件程序方面是否相同?
还有一件事我想知道:
3.如果我从main.bat调用其他批处理文件,它们是否独立运行?主批处理文件不等待其他批处理文件中的结束程序?怎么做?
当使用CALL命令在批处理脚本中调用标签时,你用GOTO:eof结束子程序,从那里发生了什么?它是否返回到子程序的CALL所在的位置?或者它是否在调用脚本的位置后继续?
例如:
ECHO It's for my college fund.
CALL :OMGSUB
ECHO *runs away and cries like a little girl*
:OMGSUB
ECHO Your mom goes to college.
GOTO:eof
ECHO *picks up jewelry box*
Run Code Online (Sandbox Code Playgroud)
在GOTO之后:eof哪条线接下来会回响?
我用set命令在cmd中设置了一个变量,然后尝试了echo.
这是一个例子:
C:\Users\Logan>set var = text
C:\Users\Logan>set var
var = text
C:\Users\Logan>echo %var%
%var%
C:\Users\Logan>
Run Code Online (Sandbox Code Playgroud)
有没有办法强制cmd echo变量而不是原始文本?
下面的批处理命令将为我提供文件夹中的最新文件,但我只查找具有特定扩展名的文件。任何人都可以解释如何指定扩展名(即.jpg)
FOR /F "delims=|" %%I IN ('DIR "C:\Jenkins\Releases\C9metro" /B /O:D') DO SET NewestFile=%%I
Run Code Online (Sandbox Code Playgroud) batch-file ×10
cmd ×7
windows ×3
errorlevel ×2
call ×1
command-line ×1
simultaneous ×1
subroutine ×1