WMI Process Call Create不会拼命运行Batch脚本

时间:2013-04-17 20:32:25

标签: windows scripting batch-file

这就是我想要做的: 我有一个NLB群集。所述群集上有两台计算机: Node1 Node2 。 我有第三台机器不在那个或任何集群中。第三台机器叫做: Monitor1

每小时一次,我想运行一个脚本来检查Node1和Node2是否已启动。 该脚本将通过TaskScheduler运行。 我使用以下命令在Node1和Node2上执行脚本:

wmic /node:NODE1,NODE2 process call create "C:\ClusterCheck.bat"

ClusterCheck.bat脚本的内容如下:

NLB Query | findstr /i /R /C:"host . is stopped"
IF %ERRORLEVEL% EQU 0 (ECHO %COMPUTERNAME%_down)>DOWN.txt
IF %ERRORLEVEL% EQU 1 (ECHO %COMPUTERNAME%_up)>UP.txt
code here

当我使用wmic /node:"%1" process call create "C:\ClusterCheck.bat"时,没有输出。 当我进入服务器并手动双击ClusterCheck.bat文件时,它会根据节点是启动还是关闭为我提供适当的输出。

有没有人知道我如何才能输出这些文件?

1 个答案:

答案 0 :(得分:4)

第一个问题,当你wmic process call create时,你应该使用cmd /c命令作为前缀。

接下来,你是对的。 wmic不会在本地控制台上显示远程创建的进程的结果输出。您需要使用专为此类事情设计的psexec,或者通过将命令输出传递给日志文件然后读取日志文件来破解变通方法。类似下面的脚本。

我不是很清楚,如果这是一个预定的任务,为什么你关心stdout可用的结果。我怀疑你打算将输出重定向到某种日志。所以我也把它放在这里。

@echo off
setlocal

set "user=domainadmin"
set "pass=password"

for /f %%I in ('wmic os get localdatetime') do set "timestamp=%%I"
set "today=%timestamp:~0,8%"

set logfile=c:\users\me\Desktop\logs\%today%.log

if not exist "%logfile%" mkdir "%logfile%\.." 2>NUL
>>"%logfile%" echo %time%

for %%I in (NODE1 NODE2) do (
    (ping -n 1 %%I >NUL && (
        net use \\%%I /user:%user% %pass% >NUL 2>NUL
        wmic /node:%%I /user:%user% /password:%pass% process call create "cmd /c c:\clustercheck.bat >c:\cc.log"
        type \\%%I\c$\cc.log && del \\%%I\c$\cc.log
        net use \\%%I /delete >NUL 2>NUL
    ) || echo %%I unresponsive
)>>"%logfile%"

forfiles /p "%logfile%\.." /M *.log  /d -30 /c "cmd /c del @path"

如果Desktop\logs不存在,则应创建Desktop\logs\YYYYMMDD.log,然后在C:\clustercheck.batNODE1上创建或追加NODE2 {{1}}的输出。最后,它会删除超过30天的日志文件。