【问题标题】:WMI Process Call Create will not Run Batch script properatelyWMI Process Call Create 将无法正确运行批处理脚本
【发布时间】:2013-04-17 20:32:25
【问题描述】:

这就是我想要做的: 我有一个 NLB 集群。所述集群上有两台机器:Node1Node2。 我有第三台机器,它不在那个或任何集群中。这第三台机器被称为: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 文件时,它会根据节点是打开还是关闭,为我提供适当的输出。

有没有人知道如何让这些文件输出?

【问题讨论】:

    标签: windows scripting batch-file


    【解决方案1】:

    第一个问题,当你wmic process call create 时,你应该在你的命令前加上cmd /c

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

    我不太清楚,如果这将是一项计划任务,为什么您会担心结果可用于标准输出。我怀疑您打算将输出重定向到某种日志。所以我也把它放在这里了。

    @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.batNODE1NODE2 上运行。最后,它会删除超过 30 天的日志文件。

    【讨论】:

    • 实际上,现在我考虑到这一点,所有的反斜杠可能都需要用另一个反斜杠转义,比如\\\\%COMPUTERNAME%\\etc.,我必须在早上进行测试。
    • PSExec 无法与任务计划程序一起正常工作。我昨天大部分时间都在努力让它工作,但没有运气。
    • %CD::=$% 应该是什么意思?
    • %CD::=$% 与当前工作目录%CD% 相同。中间的东西用冒号代替美元符号。所以"%CD%" == "C:\Users" 你有"%CD::=$%" == "C$\Users"
    • 以上行不通。这是我输入的内容: wmic /node: process call create "cmd /c C:\ClusterCheck.bat >> \\\\NetworkShare\\cc.log" >>type cc.log
    猜你喜欢
    • 2015-04-12
    • 2019-12-02
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多