Batch file 批处理文件:在特定操作系统上运行特定部件

Batch file 批处理文件:在特定操作系统上运行特定部件,batch-file,scheduled-tasks,wmic,Batch File,Scheduled Tasks,Wmic,我正在尝试创建一个脚本,目的是在W2K3或W2K12服务器上创建一个计划任务。根据目标服务器的不同,稍后将添加更多任务。我不会为每种服务器类型创建单独的脚本,因为这已经是需要通过单个包分发的安装脚本包的一部分。 服务器有不同的用户。 我尝试了以下方法,但这两个作业都是在每种服务器类型上创建的,其中一个是冗余的,因为它不适合。我只希望根据服务器类型创建一个计划任务。 目前我对如何解决这个问题有点盲目,避免使用goto也很好。如果你能接受,我将不胜感激 setlocal set runlevel=

我正在尝试创建一个脚本,目的是在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%
在: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

...
这里有一个想法,使用而不是注册表,以获得您所需的版本号。这还将仅对产品类型为3、服务器的结果进行过滤。 @setLocalEnableExtensions @设置服务器= @对于/F EOL=V代币=1-2代币=.%介入 “%\uuuu AppDir\uuuu%wbem\WMIC.exe操作系统,其中ProductType='3'获取版本' Do@Set/A服务器=%%G%%H 2>NUL @如果未定义服务器转到:EOF @如果%strVer%eq 52%\uuuuu AppDir\uuuuuu%schtasks.exe/Create/RU User1/RP epicfun^ /SC DAILY/TN Files Handler W2K3/TR D:\TMP\u DONT\u DELETE\Files\u Handler.bat^ /ST 05:30如果%STServer%Equ 62%\uuuuuuuuuuuuuuuuuuuuuuuuuu%schtasks.exe/Create/RU User2^ /RP newkidontheblock/SC DAILY/TN文件处理程序W2K12^ /TR D:\TMP\u DONT\u DELETE\Files\u Handler.bat/ST 05:30/RL
我已从Windows 2003 SchTasks命令中删除了/RL选项,因为Microsoft说该选项在该操作系统中不可用,如果您不相信,请随时将其放回。

尽管您提供的代码中存在多个错误,但更重要的是,据我所知,运行级别,/RL,选项在中不可用。此外,您可能在使用该注册表项值时也有问题。我发现有几个系统的CurrentVersion字符串值为6.3,这与使用or系统没有什么不同。我的脚本在W2K3和W2K12上运行得很好,但我知道CurrentVersion值可能会有所不同。这是我可以很容易地调整的。你现有的代码是不可能工作的。ELSE不能与括号分开。表达式%os\u ver:~,1%返回变量os\u ver内容的第一个字符,它永远不能等于由三个字符组成的字符串…它应该是exit/B或goto:EOF,以便退出批处理脚本,因为exit还会终止宿主cmd.exe实例……请注意我的评论,这表明/RL选项在Windows 2003中不可用。