这就是我想要做的: 我有一个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文件时,它会根据节点是启动还是关闭为我提供适当的输出。
有没有人知道我如何才能输出这些文件?
答案 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.bat
和NODE1
上创建或追加NODE2
{{1}}的输出。最后,它会删除超过30天的日志文件。