批处理文件在 for-Loop 开始时看似随机崩溃
Posted
技术标签:
【中文标题】批处理文件在 for-Loop 开始时看似随机崩溃【英文标题】:Batch file crashing seemingly randomly at start of for-Loop 【发布时间】:2021-08-08 12:57:22 【问题描述】:我正在尝试创建一个批处理文件来自动化某些流程,但截至目前,它一到达这一行就会崩溃
for /L %%i in (1,1,%i%) do (...)
我已经尽可能多地尝试调试,但只能设法将错误定位到这部分。 这是导致这一行的代码:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
.
.
.
set /p amount="[1] One/[2] Multiple "
if /i "%amount:~,1%" EQU "1" goto one
if /i "%amount:~,1%" EQU "2" goto multiple
:multiple
set /a i=0
for /F "usebackq delims=" %%a in (..\multiple.txt) do (
set /a i+=1
set array[!i!]=%%a
)
set /a b=1
echo %i% systems have been detected
for /L %%i in (1,1,%i%) do (
echo System !b!: IP: !array[%%i]!
set /a b+=1
)
echo.
echo Please confirm that the input is correct and all systems have been reset to their factory default
set /p confirm="[O]kay/[E]xit "
if /i "%confirm:~,1%" EQU "O" echo Okay
if /i "%confirm:~,1%" EQU "E" goto exit
echo.
echo What type of system are you trying to set up?
echo [0] CPU-Blade
echo [1] GPU-Blade
echo [2] Optic Server
echo [3] Tool Host
echo [4] Provisioning Server
echo [5] Customer Host
echo [6] Control PC
echo [7] Gateway
echo [8] Cluster File Server
echo [9] Storage Expansion Shelf
set /p system="[0]/[1]/[2]/[3]/[4]/[5]/[6]/[7]/[8]/[9] "
set /a b=1
for /L %%i in (1,1,%i%) do (
echo Resetting Chassis Intrusion for System !b!: !array[%%i]!...
我认为在崩溃之前执行的 for-Loop 可能会在使用 %%i
时出现一些问题,所以我尝试暂时将其更改为 %%e
,但没有成功。
我还复制了这个循环的另一个实例:
for /L %%i in (1,1,%i%) do (
echo System !b!: IP: !array[%%i]!
set /a b+=1
)
pause
就在崩溃循环之前,但它执行没有问题。我现在完全不知所措,任何帮助或指点将不胜感激!
【问题讨论】:
for /F "usebackq delims=" %%a in (..\multiple.txt) do (
应该做什么?你应该从文件中读取行吗?请尝试仅使用 @(for /F "usebackq delims=" %%a in (..\multiple.txt) do @echo=%%a) & pause
的测试批处理文件来检查它是否正在执行它应该执行的操作。如果不是,请打开命令提示符窗口,键入for /?
,按[ENTER]
键,然后阅读该特定命令的使用信息。我还建议您在choice
命令旨在处理的情况下停止使用set /p
(choice /?
了解更多信息)。
您是否使用我建议的单行替换批处理文件对其进行了测试?通常我会使用For /F UseBackQ^ Delims^=^ EOL^= %%G In ("..\multiple.txt") Do (
,但为了向您展示我提到它的原因,如果您将您的更改为for /F "usebackq delims=" %%a in ("..\multiple.txt") do (
或for /F "delims=" %%a in (..\multiple.txt) do (
会发生什么?本质上,如果您使用UseBackQ
双引号文件,如果您不想双引号文件,请删除UseBackQ
,您目前正在同时执行这两项操作,在我看来这是错误的!跨度>
批处理文件不会崩溃。批处理文件是一个包含代码的简单文本文件,对于文件扩展名为.bat
或.cmd
的文件,该文件需要由cmd.exe
的可执行文件解释。 Windows 命令处理器cmd.exe
在处理批处理文件时不会崩溃。它在检测到严重的语法错误时退出处理批处理文件,从而无法继续处理批处理文件。可以在debugging a batch file 上看到该错误消息,以及哪个命令行或哪个命令块负责处理退出。
我建议在How to stop Windows command interpreter from quitting batch file execution on an incorrect user input? 上阅读我的答案。将set /P
用于用户提示不是一个好主意,用户必须按一个键来选择几个提供的选项。有用于选择菜单的命令choice
。另请参阅 DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
我建议在Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files 上进一步阅读我的答案。它非常详细地解释了cmd.exe
是如何进行字符串比较的,以及为什么字符串比较运算符==
应该用于字符串比较而不是比较运算符EQU
。比较运算符 EQU
主要用于在相等性上进行整数比较,并且仅在 cmd.exe
未能成功将两个操作数之一转换为 32 位有符号整数时才进行字符串比较。
【参考方案1】:
对于任何其他有神秘问题的人 - 事实证明 for 循环内的代码确实非常相关。 我有一个“if”设置来检查我的一个变量是否为空
if %variable% == []
由于某种原因,Batch 不喜欢这样。你必须这样做:
if "%variable%" == []
否则,您的脚本将使整个 for-Loop 变得无用,并在到达时立即抛出一个通用的 "(" was not expected at this point
。
感谢大家的帮助和所有信息!
【讨论】:
if "%variable%" == []
永远不会是真的,阅读Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch file 后你就知道原因了。检查名称为variable
的环境变量是否已定义的最佳方法是使用if not defined variable command
或if defined variable command
。在命令提示符窗口中运行if /?
的帮助输出描述了检查环境变量是否存在的方法。
您写道:“由于某种原因,Batch 不喜欢那样。”批处理文件无关紧要。批处理文件只是一个文本文件。 Windows 命令处理器cmd.exe
首先在parsing 命令行期间将%variable%
替换为名称为variable
的引用环境变量的当前值。所以 IF 条件变为 if == []
on variable
根本没有定义。比较运算符==
中没有留下任何字符串的此IF 条件的语法无效,并导致执行IF 时出现错误消息并退出批处理作业。以上是关于批处理文件在 for-Loop 开始时看似随机崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 for-loop if 语句填充具有唯一随机数的数组?
Android - 看似无害的布局会导致应用在短暂使用后崩溃而没有任何错误