For loop 批处理文件在for循环开始时似乎随机崩溃

For loop 批处理文件在for循环开始时似乎随机崩溃,for-loop,batch-file,debugging,crash,For Loop,Batch File,Debugging,Crash,我正试图创建一个批处理文件来自动化一些过程,但到目前为止,它一到达这一行就崩溃了 for /L %%i in (1,1,%i%) do (...) 我已经尽可能多地调试了,但只找到了这一部分的错误。 下面是通向这一行的代码: @echo off SETLOCAL ENABLEDELAYEDEXPANSION . . . set /p amount="[1] One/[2] Multiple " if /i "%amount:~,1%" EQU "

我正试图创建一个批处理文件来自动化一些过程,但到目前为止,它一到达这一行就崩溃了

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循环可能会在使用
%%I
时出现一些问题,因此我尝试暂时将其更改为
%%e
,但没有成功。 我还复制了此循环的另一个实例:

for /L %%i in (1,1,%i%) do (
    echo System !b!: IP: !array[%%i]!
    set /a b+=1
)
pause

就在崩溃循环之前,但执行起来没有问题。我现在完全不知所措,任何帮助或指点都将不胜感激

对于其他有神秘问题的人来说,事实证明For循环中的代码确实非常相关。 我有一个“如果”设置来检查我的一个变量是否为空

if %variable% == []
出于某种原因,巴奇不喜欢这样。你必须这样做:

if "%variable%" == []
否则,脚本将使整个for循环无效,并在到达时立即抛出一个泛型
”(“此时不应抛出它。

谢谢大家的帮助和所有信息!

对于/F“usebackq delims=“%%a in(..\multiple.txt)do(
应该做什么?你应该从文件中读取行吗?请使用
@(对于/F“usebackq delims=“%%a in(..\multiple.txt)do@echo=%%a)尝试一个测试批处理文件暂停
以检查它是否正在执行它应该执行的操作(&pause)。如果没有,请打开命令提示窗口,键入
以/?
,按
[输入]
键,并阅读该特定命令的使用信息。我还建议您在
choice
命令设计用于处理的情况下停止使用
set/p
choice/?
了解更多信息)。您是否使用我建议的单行替换批处理文件对其进行了测试?通常我会使用,
For/F UseBackQ^Delims^=^EOL^=%%G In(“..\multiple.txt”)Do(
),但为了向您说明我提到它的原因,如果您将您的更改为/F“UseBackQ Delims=”%%a In(“..\multiple.txt”)Do会发生什么情况(,或(..\multiple.txt)do中的/F“delims=“%%a(?本质上,如果您正在使用
UseBackQ
双引号引用文件,如果您不想双引号引用文件,请删除
UseBackQ
,您目前正在同时执行这两项操作,这在我看来是错误的!批处理文件不会崩溃。批处理文件是一个简单的文本文件,其中的代码需要由的可执行文件进行解释e> cmd.exe用于文件扩展名为
.bat
.cmd
的文件。Windows命令处理器
cmd.exe
在处理批处理文件时不会崩溃。当检测到严重语法错误导致无法继续处理批处理文件时,它会退出批处理文件。该错误消息可在和上看到还有哪个命令行或哪个命令块负责处理退出。我建议阅读我的答案。对于用户提示,使用
set/P
,用户必须按键选择提供的几个选项,这不是一个好主意。对于选择菜单,有命令
choice
opic:我建议进一步阅读我的答案。它非常详细地解释了
cmd.exe如何进行字符串比较,以及为什么字符串比较运算符
==
应该用于字符串比较,而不是比较运算符
eq
。比较运算符
eq
主要用于整数c如果
cmd.exe
未能成功地将两个操作数之一转换为32位有符号整数,则仅在执行字符串比较时进行相等比较。
如果“%variable%”=[]
永远不会为真,阅读后您会知道原因。检查名为
variable
的环境变量是否已定义的最好方法是使用
if not defined variable command
if defined variable command
。在命令提示窗口中运行
if/?
时的帮助输出描述这就是检查环境变量是否存在的方法。您写道:“出于某种原因,批处理不喜欢这样。”批处理文件无关紧要。批处理文件只是一个文本文件。Windows命令处理器
cmd.exe
首先在命令行中将
%variable%
替换为名为
variable
的引用环境变量的当前值。因此,IF条件变为
IF=[]
变量
上的
完全没有定义。比较运算符
==
没有留下字符串的此IF条件的语法无效,并导致执行IF和批处理作业退出时出现错误消息。