我的批处理程序在检查错误级别时崩溃/关闭

问题描述 投票:0回答:1

我编写了一个小密码生成器,这样我就可以简单地运行该程序来获取任意大小的密码,其中包含我想要的字符,但是当我运行它时,有时它认为一些随机字符是命令,这它找不到。由于这会破坏密码输出并且我无法找出问题所在,因此我只是做了一行,检查错误级别,然后重新启动程序,但现在当它检查错误代码时,它只是崩溃/关闭。我无法解决这个问题,所以有人可以帮助我吗?

@echo off
color a
setlocal enabledelayedexpansion

REM Benutzer gibt die Passwortlaenge ein
set /p length=Geben Sie die Passwortlaenge ein:  

REM Hier wieder einsteigen (Zeile 8)
:repeat
set password=
set timeout=
set repeat= 

REM Zeichen für das Passwort
set "characters=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=<>?"

REM Initialisiere das Passwort
set "password="

REM Generiere das Passwort
for /L %%i in (1,1,%length%) do (
    set /a index=!random! %% 67
    for /l %%j in (!index!,1,!index!) do set "char=!characters:~%%j,1!"
    set "password=!password!!char!"
)
::if errorlevel 1 set repeat=true

REM Error wiederholung
if %repeat%==true cls
if %repeat%==true goto repeat


REM Zeige das generierte Passwort an
echo Generiertes Passwort: %password%

REM Wie lange soll angezeigt werden?
set /p timeout=Wie lange soll das Passwort angezeigt werden (in Sekunden)?  
timeout %timeout% >NUL

REM Soll noch ein Passwort generiert werden?
set /p repeat=Noch eins? j/n  
if %repeat%==j goto repeat

echo Schliesse das Programm in 10 Sekunden...
timeout 10

endlocal

只希望当 ERRORLEVEL 大于 0 时,它能够正确重新启动密码生成。

windows batch-file crash passwords errorlevel
1个回答
0
投票

提示:使用

set "var=value"
设置字符串值 - 这可以避免尾随空格引起的问题。不要分配
"
或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程变得更容易。如果使用语法
set var="value"
,则引号将成为分配值的一部分。

当您使用点击并咯咯的方法执行批处理时,如果发现语法错误或脚本运行完成,则批处理窗口将关闭。您可以在语句后放置

pause
并返回错误,但最好打开“命令提示符”并从那里运行批处理,以便窗口保持打开状态并显示任何(错误)消息.

请考虑

choice
,它是为选项选择任务而设计的。使用搜索功能查找
[batch-file] choice
,例如。 Gerhard 的示例 或从提示中查看文档 -
choice /?

您的问题是,如果没有错误,

repeat
设置为nothing,因此命令
if %repeat%==true cls
解析为
if ==true cls
,这是一个语法错误。

使用布尔值

请小心使用

%
!
(尤其是),因为它们在批处理中具有特殊含义。
^&*()=<>?

还有特殊含义

您的字符串长度为 79 个字符,而不是 67。

for /l %%j in (!index!,1,!index!) 
可以替换为
for %%j in (!index!) 

© www.soinside.com 2019 - 2024. All rights reserved.