Windows批处理文件有哪些鲜为人知但又重要且有用的功能?
指南:
澄清:我们在这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值.
(另请参阅:Windows批处理文件:.bat vs .cmd?)
我试图spawn实现一个rm -rf node_modules跟随npm install(在Windows 7; n x命令由透明安装的CygWin提供.所有n x命令在命令行上解析就好了).
我最初使用它exec,但想要捕获stdout/stderr信息,因此我想我会使用spawn,并重写代码使用它.然而,这打破了一切.
rm重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("rm", ["-rf", "node_modules"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });
Run Code Online (Sandbox Code Playgroud)
但是,运行它会生成以下错误:
rm: unknown option -- ,
Try `rm --help' for more information.
Run Code Online (Sandbox Code Playgroud)
npm重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("npm", ["install"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { …Run Code Online (Sandbox Code Playgroud) 我使用WinXP sp3,我创建了一个可以做某事的.bat文件.当我双击它时,打开一个记事本,我可以编辑批处理文件 - 但它不会运行??!?!
我希望当我双击一个.bat文件时 - 它应该运行,不是吗?我怎样才能解决这个问题?
为什么这个批处理文件永远不会脱离循环?
For /L %%f In (1,1,1000000) Do @If Not Exist %%f Goto :EOF
Run Code Online (Sandbox Code Playgroud)
不应该Goto :EOF突破循环?
我想我应该更明确地问... 我怎么能摆脱循环?
在Windows批处理脚本中处理错误的常用方法是使用
if errorlevel 1 ...或等if %errorlevel% neq 0 ....通常,人们希望错误处理代码保留ERRORLEVEL.
我相信所有外部命令总是会导致ERRORLEVEL被设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL.
但内部命令怎么样?问题是,一些内部命令在成功时将ERRORLEVEL清除为0,而有些则没有.而且我找不到任何指定哪些命令做什么的文档.
所以问题是,哪些内部命令成功后将ERRORLEVEL清除为0?这不是关于返回的ERRORLEVEL代码的一般问题,而是严格关于成功结果的问题.
有些帖子如何将ERRORLEVEL重置为零的最简单方法是什么?和Windows批处理文件:.bat vs .cmd?给出部分答案.但我从未见过全面的清单.
注意: 多年来我一直很好奇.所以我最终决定进行一系列实验并得出一个明确的答案.我发布此问答来分享我发现的内容.
Windows命令提示符执行具有相同名称但不同扩展名的文件的顺序是什么?
例如,我有一堆可执行文件(something.cmd,something.bat,something.exe).当我在命令提示符中键入"something"时(如果它们在路径上等),将执行以下哪些操作?如果该文件不存在,那么将执行哪一个?
有没有描述这个的参考?
嗨,
我正在学习Windows Batch编程并遇到这个问题:
.bat和.cmd文件有什么区别?
如果它们是相同的,为什么需要2个呢?
BTW,command.com和cmd.exe有什么区别?
考虑以下bat,test.bat(PC01关闭):
mkdir \\PC01\\c$\Test || goto :eof
Run Code Online (Sandbox Code Playgroud)
如果我从命令shell运行该bat:
> test.bat || echo 99
> if ERRORLEVEL 1 echo 55
Run Code Online (Sandbox Code Playgroud)
输出只有55.没有99.有一个错误级别,但||操作员没有看到它.
如果我用那个蝙蝠跑 cmd /c -
> cmd /c test.bat || echo 99
> if ERRORLEVEL 1 echo 55
Run Code Online (Sandbox Code Playgroud)
输出为空白.Errorlevel为0.
如果我删除了|| goto :eof,一切都按照人们的预测 - 即输出即可
99 55
有谁知道为什么这种半生半熟的ERRORLEVEL行为正在发生?
我们有一堆.bat构建脚本,这些脚本由基于 PowerShell 的 GitLab 运行器调用,这些运行器最近重构为:
program args
if !errorlevel! neq 0 exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
更简洁:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
今天我调查了一个构建作业,如果您查看错误日志,该作业显然失败了,但报告为成功。经过大量实验,我发现这种模式并不总是按预期工作:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
但是当前者没有时,这似乎确实有效:
program args || exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 SO question Windows batch exit option b with or without errorlevel和下面来自https://www.robvanderwoude.com/exit.php的声明,但仍然不能完全解释我正在观察的内容。
DOS 联机帮助 (HELP EXIT) 没有明确说明 /B 参数退出当前脚本实例不一定与退出当前脚本相同。即,如果脚本在 CALLed 代码段中,则 EXIT /B 退出 CALL,而不是脚本。
这是我用来探索这个的最小批处理文件:
@echo off
setlocal EnableDelayedExpansion
cmd /c "exit 99" || exit /b
:: cmd /c …Run Code Online (Sandbox Code Playgroud) 有一个script.sh文件
set FABRIC_CFG_PATH=<some path>
set CORE_PEER_LOCALMSPID=<some id>
Run Code Online (Sandbox Code Playgroud)
如果我在 Windows 中运行此脚本,则不会设置环境变量。而如果使用 cmd 方法设置 env,例如,在 windows cmd 上
set FABRIC_CFG_PATH=<some path>
它工作正常。
那么如何通过shell脚本文件在windows中设置env呢?
在.bat文件中运行long命令时(比如300个字符长度)
例如:
Some_exe "C:/Documents and Settings/Some user/Some folder1/Some folder2/Some folder3/Some folder4 ... -Some_exe_arg1="arg 1 name" -Some_exe_arg2="arg 2 name" -Some_exe_arg3="arg 3 name"
Run Code Online (Sandbox Code Playgroud)
CMD.exe可以处理的行大小是否有限制?我应该使用.CMD还是.BAT?有什么方法可以克服这个限制吗?
谢谢!
我觉得这必须是如此简单,不知怎的,我只是遗漏了一些东西.我有3个命令,我必须连续执行.如何将这些全部放入一个批处理文件中?
以下是命令:
cl /c /Zl /I"c:\EFI_Toolkit_2.0\include\efi" /I"c:\EFI_Toolkit_2.0\include\efi\em64t" c:\sandbox\efi_main.c
link /entry:main /dll /IGNORE:4086 efi_main.obj
fwimage.exe app efi_main.dll efi_main.efi
Run Code Online (Sandbox Code Playgroud)
我尝试在每行的前面添加'start',虽然我看到每个命令echo'd只有第一个执行(即我只获得efi_main.obj但不是.dll或.efi).
这些也需要在visual studio shell中执行,只要我从shell中运行我的批处理文件我认为这就足够了吗?
此脚本自动生成图像标记,但我需要将此命令放入Windows bat文件中.在cmd窗口中编写时,这段代码可以正常工作.
FOR %i IN (*.JPG) DO ECHO ^<img src="%i" /^> >> index.html
Run Code Online (Sandbox Code Playgroud)
感谢致敬
batch-file ×11
cmd ×5
windows ×4
powershell ×2
break ×1
command-line ×1
dos ×1
errorlevel ×1
exec ×1
export ×1
file ×1
for-loop ×1
node.js ×1
set ×1
shell ×1
spawn ×1
windows-xp ×1