【问题标题】:Batch file: Run specific part on particular OS批处理文件:在特定操作系统上运行特定部分
【发布时间】:2020-10-15 21:19:30
【问题描述】:

我正在尝试创建一个脚本,目的是根据目标服务器在 W2K3 或 W2K12 服务器(稍后添加更多内容)上创建计划任务。我不会为每种服务器类型创建单独的脚本,因为这已经是需要通过单个包分发的安装脚本包的一部分。 服务器有不同的用户。 我尝试了以下方法,但 两个 作业是在每种服务器类型上创建的,其中一个是多余的,因为它不适合。我只希望根据服务器类型创建 一个 计划任务。 目前我对如何解决它有点盲目,避免使用“goto”也很好。非常感谢您对此的看法。

setlocal
set runlevel=

for /f "tokens=2*" %%i in ('reg.exe query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "CurrentVersion"') do set os_ver=%%j

if /i "%os_ver:~,1%" EQU "5.2" (
set runlevel=/rl HIGHEST goto W2K3
exit
)
else
(
if /i "%os_ver:~,1%" GEQ "6.2" (
set runlevel=/rl HIGHEST goto W2K12
exit
)
)

:W2K3
schtasks.exe /create /tn "Files Handler W2K3" /sc DAILY /TR "D:\TMP_DONT_DELETE\Files_Handler.bat" /ST 05:30 /ru User1 /rp epicfun %runlevel%


:w2K12
schtasks.exe /create /tn "Files Handler W2K12" /sc DAILY /TR "D:\TMP_DONT_DELETE\Files_Handler.bat" /ST 05:30 /ru User2 /rp newkidontheblock %runlevel%

【问题讨论】:

  • 尽管您提供的代码中有几个错误,但更重要的是要提一下,据我所知,schtasks.exe 运行级别,/RL,选项在windows-server-2003.
  • 除此之外,您也可能在使用该注册表项值时遇到问题。我发现有几个windows-10 系统的CurrentVersion 字符串值为6.3,这与拥有windows-server-2012-r2windows-8.1 系统没有什么不同。
  • 我的脚本在 W2K3 和 W2K12 上运行良好,但我知道 CurrentVersion 值可能会有所不同。这是我可以很容易调整的。
  • 现有代码无法正常工作。 ELSE 不能与括号分开。
  • 表达式%os_ver:~,1%返回变量os_ver的内容的第一个字符,它永远不能等于由三个字符组成的字符串……

标签: batch-file scheduled-tasks


【解决方案1】:
这是一个使用 而不是注册表的想法,以获取所需的版本号。这还会将结果过滤为仅产品类型为 3 (Server) 的结果。
@SetLocal EnableExtensions
@Set "strVer="
@For /F "EOL=V Tokens=1-2 Delims=." %%G In (
    '%__AppDir__%wbem\WMIC.exe OS Where "ProductType='3'" Get Version'
) Do @Set /A "strVer=%%G%%H" 2>NUL
@If Not Defined strVer GoTo :EOF
@If %strVer% Equ 52 (%__AppDir__%schtasks.exe /Create /RU User1 /RP epicfun^ 
 /SC DAILY /TN "Files Handler W2K3" /TR "D:\TMP_DONT_DELETE\Files_Handler.bat"^
 /ST 05:30) Else If %strver% Equ 62 %__AppDir__%schtasks.exe /Create /RU User2^
 /RP newkidontheblock /SC DAILY /TN "Files Handler W2K12"^
 /TR "D:\TMP_DONT_DELETE\Files_Handler.bat" /ST 05:30 /RL HIGHEST

我已经从 Windows 2003 的 SchTasks 命令中删除了 /RL 选项,因为 Microsoft 说它在该操作系统中不可用,如果您不相信,请随时将其放回。

【讨论】:

    【解决方案2】:

    在 :W2K3 schtasks.exe 语句之后放置 goto :EOF 语句并删除 %runlevel% 因为 Compo 的回答中指出它不受支持:

    ...
    
    :W2K3
    schtasks.exe /create /tn "Files Handler W2K3" /sc DAILY /TR "D:\TMP_DONT_DELETE\Files_Handler.bat" /ST 05:30 /ru User1 /rp epicfun
    goto :EOF
    
    ...
    

    【讨论】:

    • 应该是exit /Bgoto :EOF 才能退出批处理脚本,因为exit 也会终止托管cmd.exe 实例...
    • ...请注意我的 cmets,这表明 /RL 选项在 Windows 2003 中不可用。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2011-05-19
    • 2021-11-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多