【问题标题】:batch script to exit process with error批处理脚本以错误退出进程
【发布时间】:2026-01-03 15:55:02
【问题描述】:

我在一个学区工作,我们需要远程删除个人资料。我们正在使用 RemProf。如果脚本遇到两个特定域或名称中具有特定标识符的设备,我需要脚本失败。我希望它以错误代码退出。这将使我们的现场工作人员知道他们已尝试针对因域名或名称而受到限制的设备运行 RemProf。这就是我所拥有的。带有-SAD- 的行标识设备名称的一部分。如果遇到错误级别 1,此脚本不会退出。它会继续使用 RemProf 并删除配置文件。如有任何指导,我将不胜感激。

Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Hostname /f -SAD-
if %ERRORLEVEL%==1 exit /b 9

Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Domain /f teach.inst.schools
if %ERRORLEVEL%==1 exit /b 0

Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Domain /f admin.schools
if %ERRORLEVEL%==1 exit /b 9


Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Domain /f elem.inst.schools
if %ERRORLEVEL%==0 goto Run_RemProf

Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Domain /f sec.inst.schools
if %ERRORLEVEL%==0 goto Run_RemProf


:Run_RemProf

Rem Deleteing profiles and abandoned files

RemProf.exe /D: /EXCLUDE:Public,Default,Administrator,SOL
RemProf.exe /AD: /EXCLUDE:Public,Default,Administrator,SOL

【问题讨论】:

    标签: batch-file profile


    【解决方案1】:

    你的Reg Query HKLM\System\CurrentControlSet\services\Tcpip\Parameters /v Hostname /f -SAD- 总是返回Hostname值,以及适当的errorlevel返回值0 - 成功(或1 - 失败)不管 /f 开关中提供的数据或模式。

    reg query /? 关于同时使用/V/F 开关有点简短:

      /v       Queries for a specific registry key values.
               If omitted, all values for the key are queried.
    
               Argument to this switch can be optional only when specified
               along with /f switch. This specifies to search in valuenames only.
    
      /f       Specifies the data or pattern to search for.
               Use double quotes if a string contains spaces. Default is "*".
    

    Another official source 说关于/V 开关:

    /v <ValueName> 指定注册表值名称 询问。如果省略,则返回 KeyName 的所有值名称。 如果/f 选项为 也用过。

    可选? Read dictionary.com definitions for adjective optional:

    • common: 由自己选择;不是必需的或强制性的;
    • 英国:可能但不是强制性的;留给个人选择。

    其实ValueName for /V parameter should be omitted if the /f option is also used(非官方):

    要搜索注册表的一部分,请使用以下语法:

    REG Query HKxx\subkey [/D|/K|/V] /F "search_pattern" [/S] [/E] [/C]
    

    使用/D 搜索数据(即注册表值的值),/K 搜索匹配的键名,/V 搜索匹配的值 名称,或者这些都没有切换到搜索键、值和数据。

    你可以:

    示例脚本(部分注释):

    @ECHO OFF
    SETLOCAL EnableExtensions DisableDelayedExpansion
    
    set "_pattern=%~1"        for demonstration purposes: first line parameter
    if not defined _pattern set "_pattern=-SAD-"
    
        rem next `_KeyName` variable keeps `reg query` line length <80 chars
    set "_KeyName=HKLM\System\CurrentControlSet\services\Tcpip\Parameters"
    
    echo(
    echo `findstr` approach:
    Reg Query "%_KeyName%" /v Hostname | findstr /I /C:"%_pattern%" >NUL
    if errorlevel 1 (
      echo `Hostname` data DOES NOT CONTAIN specified string "%_pattern%"
    ) else (
      echo `Hostname` data CONTAINS specified string "%_pattern%"
    )
    
    echo(
    echo `substring` approach:
        rem set `_Hostname` and `_Domain`  
    for /F "tokens=1,2,*" %%G in ('
        Reg Query "%_KeyName%" ^| findstr /I /R "\<Domain\> \<Hostname\>"
                                ') do set "_%%G=%%I"
    call set "_auxiliary=%%_Hostname:%_pattern%=%%"
    if "%_auxiliary%"=="%_Hostname%" (
      echo `Hostname` data DOES NOT CONTAIN specified string "%_pattern%"
    ) else (
      echo `Hostname` data CONTAINS specified string "%_pattern%"
    )
    

    输出

    ==> D:\bat\SO\39359057.bat -SAD-
    
    `findstr` approach:
    `Hostname` data DOES NOT CONTAIN specified string "-SAD-"
    
    `substring` approach:
    `Hostname` data DOES NOT CONTAIN specified string "-SAD-"
    
    ==> D:\bat\SO\39359057.bat %computername%
    
    `findstr` approach:
    `Hostname` data CONTAINS specified string "myNewPC"
    
    `substring` approach:
    `Hostname` data CONTAINS specified string "myNewPC"
    
    ==>
    

    【讨论】:

    • 感谢您的信息。它解释了为什么我总是得到相同的返回值。我假设我可以调整行来搜索域。如果脚本找到该字符串,我将如何继续让脚本失败并显示退出代码,或者如果没有,则继续删除配置文件。我主要关心的是如果找到该名称和/或域,则让脚本退出/取消/停止。我想让盒子关上。感谢您的帮助。
    最近更新 更多