If statement Windows命令行处理器:多个嵌套的IF语句

If statement Windows命令行处理器:多个嵌套的IF语句,if-statement,command-line,nested,If Statement,Command Line,Nested,预期软件:windows命令行处理器(版本6.1.7601.17514) 嗨 我一直在尝试构建一个在一条捷径内运行的多语句命令行。我的目标是能够单击一条检查托管网络是否启动的捷径,然后根据检查结果采取适当的操作。启动和停止托管网络的代码很好,并且在大多数情况下,逻辑工作正常,但是当我检查逻辑的输出时,我注意到奇怪的行为。我怀疑我的问题与我构建语句的方式有关,但我很难正确解释内置文档和MSDN库中的文档。如果可能的话,我希望避免在这个解决方案中使用批处理文件 为了简单起见,我将冗长的“netsh”

预期软件:windows命令行处理器(版本6.1.7601.17514)

我一直在尝试构建一个在一条捷径内运行的多语句命令行。我的目标是能够单击一条检查托管网络是否启动的捷径,然后根据检查结果采取适当的操作。启动和停止托管网络的代码很好,并且在大多数情况下,逻辑工作正常,但是当我检查逻辑的输出时,我注意到奇怪的行为。我怀疑我的问题与我构建语句的方式有关,但我很难正确解释内置文档和MSDN库中的文档。如果可能的话,我希望避免在这个解决方案中使用批处理文件

为了简单起见,我将冗长的“netsh”命令替换为显示错误代码的“echo”命令。下面的代码是我用来测试逻辑的代码:

测试代码

netsh wlan show hostednetwork | find "Not" && echo found %errorlevel% || echo lost %errorlevel%
目前,我阅读这篇文章的方式是:

  • 显示hostednetwork的状态并将输出发送到input
  • 尝试在输入中查找字符串“Not”
  • 如果尝试成功,则将“发现”和错误代码输出到屏幕
  • 如果尝试失败,则向屏幕输出“丢失”和错误代码
  • 请注意,我没有在
    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
    
    我希望当我(作为管理员)打开命令提示符时:

  • 如果hostednetwork没有启动,我应该在输出中看到“found 0”,这意味着找到了字符串,并且没有错误
  • 如果hostednetwork启动,我应该会在输出中看到“lost 1”,这意味着找不到字符串,并且出现了错误
  • 案例1起作用,但案例2在第一次尝试时不起作用。以下是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
    
    我编写测试代码的方式是迄今为止我能想到的最好的方式。在以前的尝试中,我尝试过:

  • 设置一个自定义变量而不是使用errorlevel变量,但是我在案例2中得到了相同的输出
  • 将代码更改为if-else等效代码,但效果并不理想
  • 将条件语句包装在管道后面的括号“()”中,并使用特殊符号“&”和“|”的不同组合
  • 其他问题

    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中运行命令行程序/批处理文件,你可以使用