批处理文件 - IF 语句问题

Posted

技术标签:

【中文标题】批处理文件 - IF 语句问题【英文标题】:Batch File - IF statement issue 【发布时间】:2021-06-23 15:32:10 【问题描述】:

您好,我所有的 *** 成员!我正在尝试设置一个基本的脚本,以帮助在面向域的公司环境中检查域控制器上的用户帐户详细信息。一位 IT 服务经理设置了一个非常淡化的脚本,基本上只运行以下命令:

网络用户/域

我试图构建一个更好的脚本,因为我们在许多客户环境中都使用它,它减少了猜测工作和整体时间。问题是在脚本的末尾,我设置了一个直接返回到脚本顶部的提示 ay/n。但是,如果您没有按 Y 或 N(不区分大小写)而是按 j 或 3,例如脚本终止。我在设置一个基本的错误处理例程时非常不成功,如果报告的值既不是 y 也不是 n,则回显一个简单的错误字符串,然后重复提示。以下是我的设置代码(我已经删除了以前为 y/n 值设置循环例程的尝试。我已经更改了每个 GOTO 部分的实际路径的值,以免共享面向客户的信息。

@ECHO OFF

:Start
SET uname=
cls

IF "%userdomain%"=="D1" GOTO 1
IF "%userdomain%"=="D2" GOTO 2
IF "%userdomain%"=="D3" GOTO 3
IF "%userdomain%"=="D4" GOTO 4

:1
ECHO You are on the D1 domain (%userdomain%)
ECHO Usernames should be in the format of firstname.lastname
ECHO.
SET /P uname=Username: 
IF "%uname%"=="" GOTO Error
net user %uname% /domain
GOTO Request

:2
ECHO You are on the D2 Domain (%userdomain%)
ECHO Username format varies based on the creation of the ID.
ECHO.
SET /P uname=Username: 
IF "%uname%"=="" GOTO Error
net user %uname% /domain
GOTO Request

:3
ECHO You are on the D3 Domain (%userdomain%)
ECHO Usernames are formatted as First Initial Last Name (auser)
ECHO.
SET /P uname=Username: 
IF "%uname%"=="" GOTO Error
net user %uname% /domain
GOTO Request

:4
ECHO You are on the D4 Domain (%userdomain%)
ECHO Usernames are formatted as First Initial Last Name (auser)
ECHO.
SET /P uname=Username: 
IF "%uname%"=="" GOTO Error
net user %uname% /domain
GOTO Request

:Error
ECHO.
ECHO Username was left blank, please enter a valid username and try again
ECHO.
TIMEOUT /T 5
GOTO Start

:Request
ECHO.
SET /P resp=Do you want to perform another lookup Y/N?
IF /I "%resp%"=="y" GOTO Start
IF /I "%resp%"=="n" exit

在上面的 :Request 部分中,我尝试使用 IF /I NOT 和 IF NOT /I 来开始语句,以及使用面向 false 的值将变量设置为 true,然后让语句说 if not y if not n 将变量设置为 false,然后使用 if false,重复循环,到目前为止,按下 y 或 n 以外的任何键都会退出提示。

任何帮助表示赞赏,并提前感谢!

【问题讨论】:

您可以在IF /I "%resp%"=="n" exit 之后添加GOTO Request。但是使用CHOICE 可能是更好的选择。 因为首先运行的命令是 net user 命令,所以文件的结尾部分会询问您是否要再次运行该命令。如上所述,我没有说明问题是命令本身,只是问题在于命令在其中运行的文件。 这个问题的措辞是相应的,不需要更改,它是非常专门设计的。但是..我会更改标题,但我似乎无法从网站上的任何菜单或区域中找到这样做的方法。 对不起,我错过了这是一个有效的链接,标题已被编辑 【参考方案1】:

您使用了错误的命令,当只需要已知输入时,请改用choice.exe 实用程序:

@ECHO OFF

:Start
CLS
ECHO You are on the D%USERDOMAIN:~-1% domain (%USERDOMAIN%)
ECHO Usernames should be in the format of firstname.lastname
ECHO(
SET "uname="
SET /P "uname=Username: "
IF NOT DEFINED uname GOTO Error
NET USER %uname% /DOMAIN
GOTO Request

:Error
ECHO(
ECHO Username was left blank, please enter a valid username and try again
ECHO(
TIMEOUT /T 5
GOTO Start

:Request
ECHO(
CHOICE /M "Do you want to perform another lookup"
IF NOT ERRORLEVEL 2 GOTO Start

关闭前带有消息的附加示例。

@ECHO OFF

:Start
CLS
ECHO You are on the D%USERDOMAIN:~-1% domain (%USERDOMAIN%)
ECHO Usernames should be in the format of firstname.lastname
ECHO(
SET "uname="
SET /P "uname=Username: "
IF NOT DEFINED uname GOTO Error
NET USER %uname% /DOMAIN
GOTO Request

:Error
ECHO(
ECHO Username was left blank, please enter a valid username and try again
ECHO(
TIMEOUT /T 5
GOTO Start

:Request
ECHO(
CHOICE /M "Do you want to perform another lookup"
IF NOT ERRORLEVEL 2 GOTO Start
ECHO(
ECHO Thank you and goodbye.
ECHO Press any key to exit. . .
TIMEOUT /T -1 >NUL

【讨论】:

所以只要确保我理解,CHOICE 实用程序会专门询问基于 Y/N 的请求,如果输入了 Y/N 以外的任何内容,它会失败,否则开始?这样做的问题是,如果用户选择 N,则该实用程序应该退出,如果是 Y,只有在那时,才开始。更大的问题是,如何在仍然使用相同的推荐实用程序的同时,像对空白用户名部分而不是预设响应那样执行自定义错误? 默认情况下,选择命令提供特定于语言的Y|N(是|否)选项。因此,例如在德国,它将提供J|N (Ja|Nein)。如果选择了第一个选项,我提供的代码将 GOTO Start,这就是您想要的。任何不是第一个选项的有效答案都将越过GOTO Start 行,并且由于此后没有更多命令,脚本将结束。请打开命令提示符窗口,键入choice /?,按[ENTER] 并阅读使用信息。我已经提供了一个包含一些命令的附加示例,也为您提供了错误消息。 那么重读/?文档帮助我了解了选择实用程序的选择和使用。但是,如果用户按下无效键而不是显示错误消息,我只想在自定义错误消息(例如“无效键选择”之后)回收原始 :Request 部分,然后让它循环回 CHOICE,而不是简单地让它发出声音。它在出口处的运作方式工作正常,如果检测到是,则 GOTO Start 部分也是如此。

以上是关于批处理文件 - IF 语句问题的主要内容,如果未能解决你的问题,请参考以下文章

我在批处理文件中遇到 if 语句的问题 [重复]

批处理文件中的变量和 if 语句存在问题[重复]

批处理文件 - IF 语句问题

批处理文件在 if 语句处不断崩溃

批处理文件 If 语句导致 CMD 关闭且不起作用

使用 if 语句后跟调用似乎在批处理文件中不起作用