【发布时间】: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 位有符号整数时才进行字符串比较。
标签: for-loop batch-file debugging crash