If statement Windows命令行处理器:多个嵌套的IF语句
预期软件:windows命令行处理器(版本6.1.7601.17514) 嗨 我一直在尝试构建一个在一条捷径内运行的多语句命令行。我的目标是能够单击一条检查托管网络是否启动的捷径,然后根据检查结果采取适当的操作。启动和停止托管网络的代码很好,并且在大多数情况下,逻辑工作正常,但是当我检查逻辑的输出时,我注意到奇怪的行为。我怀疑我的问题与我构建语句的方式有关,但我很难正确解释内置文档和MSDN库中的文档。如果可能的话,我希望避免在这个解决方案中使用批处理文件 为了简单起见,我将冗长的“netsh”命令替换为显示错误代码的“echo”命令。下面的代码是我用来测试逻辑的代码: 测试代码If statement Windows命令行处理器:多个嵌套的IF语句,if-statement,command-line,nested,If Statement,Command Line,Nested,预期软件:windows命令行处理器(版本6.1.7601.17514) 嗨 我一直在尝试构建一个在一条捷径内运行的多语句命令行。我的目标是能够单击一条检查托管网络是否启动的捷径,然后根据检查结果采取适当的操作。启动和停止托管网络的代码很好,并且在大多数情况下,逻辑工作正常,但是当我检查逻辑的输出时,我注意到奇怪的行为。我怀疑我的问题与我构建语句的方式有关,但我很难正确解释内置文档和MSDN库中的文档。如果可能的话,我希望避免在这个解决方案中使用批处理文件 为了简单起见,我将冗长的“netsh”
netsh wlan show hostednetwork | find "Not" && echo found %errorlevel% || echo lost %errorlevel%
目前,我阅读这篇文章的方式是:
find
命令上使用任何标志。我这样做是因为我想减少找到错误匹配的机会。为了澄清我的意思,如果我只是输入netsh wlan show hostednetwork
:
主机网络状态的样本输出
C:\Windows\system32>netsh wlan show hostednetwork
Hosted network settings
-----------------------
Mode : Allowed
SSID name : "TestHost"
Max number of clients : 100
Authentication : WPA2-Personal
Cipher : CCMP
Hosted network status
---------------------
Status : Not started
如果我搜索字符串“Not”,那么这就足以告诉我hosteadnetwork没有启动,因为当hosteadnetwork启动时,输出显示“started”
我模拟hostednetwork条件的方法是使用以下命令:
netsh wlan start hostednetwork
netsh wlan stop hostednetwork
我希望当我(作为管理员)打开命令提示符时:
C:\Windows\system32>netsh wlan start hostednetwork
The hosted network started.
C:\Windows\system32>netsh wlan show hostednetwork | find "Not" && echo found %er
rorlevel% || echo lost %errorlevel%
lost 0
C:\Windows\system32>netsh wlan show hostednetwork | find "Not" && echo found %er
rorlevel% || echo lost %errorlevel%
lost 1
其他尝试的解决方案
C:\Windows\system32>netsh wlan show hostednetwork
Hosted network settings
-----------------------
Mode : Allowed
SSID name : "TestHost"
Max number of clients : 100
Authentication : WPA2-Personal
Cipher : CCMP
Hosted network status
---------------------
Status : Not started
我编写测试代码的方式是迄今为止我能想到的最好的方式。在以前的尝试中,我尝试过:
C:\Windows\system32>netsh wlan show hostednetwork
Hosted network settings
-----------------------
Mode : Allowed
SSID name : "TestHost"
Max number of clients : 100
Authentication : WPA2-Personal
Cipher : CCMP
Hosted network status
---------------------
Status : Not started
这个问题与我一直想弄明白的另一个问题有关。如果我想在命令的输出中搜索三个不同的字符串,并针对每个字符串使用不同的错误代码退出,我该怎么做?下面的语法是我的出发点:
myCommand [/options] | ((find "string1" && exit /b 2 || ver>nul) &&
(find "string2" && exit /b 3 || ver>nul) && (find "string3" && exit /b 4 || ver>nul))
出于上述相同的原因,我没有在“find”命令上使用任何标志。另外,我使用“ver>nul”试图保持语法正确,因为我知道“ver”操作成功
感谢您的帮助。您不能在同一行中计算变量。它需要延迟扩展和更新!错误等级!待使用
在批处理文件中执行此操作,使用延迟扩展不会有问题。我不明白为什么要避免使用批处理脚本。您的快捷方式可以简单地指向一个小批量脚本,这样生活就会轻松得多 但是你可以做你想做的事。
%errolevel%
的值是在解析过程中确定的,整个快捷方式在一次过程中被解析,因此您可以获得在执行FIND命令之前存在的值。您需要延迟扩展!错误等级代码>以获得所需的结果
在批处理中,您使用的是setlocal enableDelayedExpansion
,但这在命令行(或快捷方式)中不起作用。相反,您必须使用/V:ON
选项实例化一个额外的CMD.EXE
netsh wlan show hostednetwork | cmd /v:on /c "find "Not" && echo found !errorlevel! || echo lost !errorlevel!"
引用有多个层次,这有时会导致问题。如果转义特殊字符,则可以消除包含命令的引号
netsh wlan show hostednetwork | cmd /v:on /c find "Not" ^&^& echo found !errorlevel! ^|^| echo lost !errorlevel!
关于你的第二个问题,我发现了两个问题
1) 我不明白为什么要设计一个带有不同错误代码的快捷方式来退出。如何使用返回的错误代码
2) 不能将内容导入多个“查找”命令。第一个FIND命令将使用所有内容并关闭管道,随后的FIND命令将无限期地等待来自键盘的内容
您必须将命令输出重定向到临时文件,然后将每个FIND命令的输入重定向到临时文件。只是出于好奇(我不知道您的问题的答案):为什么不尝试在Powershell/C#/VB中这样做?您可以运行每个命令,检查退出代码并决定下一步运行什么/如何运行。你可能会轻松些。我想你是在回答我的另一个问题。我没有尝试C#或Powershell中的语法,因为我还没有学会这些语言。我没有在VB中尝试语法的原因是“myCommand”是PuTTY Telnet工具的一部分,据我所知,我不能直接运行操作,我必须通过命令行运行它们。不过,我还是应该试试。你可以在VB中运行命令行程序/批处理文件,你可以使用