关闭远程计算机不工作

Shutdown of remote computers not working

我正在为 class 编写一个脚本,它将查看网络上的每台计算机,然后关闭每台计算机。我有脚本的第一部分。但是,脚本的第二部分似乎没有做任何事情。

这是脚本中不起作用的部分。

Sub shutdown
  'Open a text file of computer names with one computer name per line
  'get the next computer name store it in variable strMachine
  'go through the text file
  const READ=1
  Set fso = CreateObject("Scripting.FileSystemObject")
  set objFile = fso.GetFile("c:\comp230\computers.txt")

  If objFile.size > 0 Then
    Set objReadFile=fso.openTextFile("c:\comp230\computers.txt", READ)
    Do Until objReadFile.AtEndOfStream
      strline = objReadFile.ReadLine()
      'If strMachine = Vlab-PC1 Then 
        'Exit Do
      'End If
      Set WshShell = WScript.CreateObject("WScript.Shell")
      WshShell.Run "cmd.exe  /c shutdown -s -f -m" & strline & " /c " & _
        strWarning & " /t " & strDelay, 0, False
    Loop
    objReadFile.Close
  End If
  'close the text file
End Sub

我已将问题缩小到这一行:

WshShell.Run "cmd.exe  /c shutdown -s -f -m" & strline & " /c " & _
  strWarning & " /t " & strDelay, 0, False

正如其他人已经指出的那样,您需要一个 space shutdown 命令的参数,它们和它们的参数之间需要一个 space。来自 command help:

Syntax
shutdown [{-l|-s|-r|-a}] [-f] [-m [\ComputerName]] [-t xx] [-c "message"] [-d[u][p]:xx:yy]

Parameters
[…]
-m [ \ ComputerName ] : Specifies the computer that you want to shut down.
-t xx : Sets the timer for system shutdown in xx seconds. The default is 20 seconds.
-c " message " : Specifies a message to be displayed in the Message area of the System Shutdown window. You can use a maximum of 127 characters. You must enclose the message in quotation marks.

无论您使用 -p 还是 /p 形式都无关紧要,shutdown.exe 都接受。

如果您提供 IP 地址作为参数 -m 的参数,则不需要前导 \,并且只有在以下情况下才需要参数 -c 的参数周围的双引号文本包含 spaces。不过,它们不会受到其他伤害。

此外,运行使用 cmd.exe 命令是可选的,因为 shutdown 是一个可执行文件(不是像 dir 这样的 CMD 内置命令),而且您不需要不要使用任何特定于 CMD 的内容,例如输出重定向。

基本上,您的关机命令行应如下所示:

"shutdown -s -f -m " & strline & " -c """ & strWarning & """ -t " & strDelay

或者(如果您使用的是主机名而不是 IP 地址)像这样:

"shutdown -s -f -m \" & strline & " -c """ & strWarning & """ -t " & strDelay

更笼统地说,在对 VBScript 中的外部命令进行故障排除时,最好在单独的变量中构建命令字符串,这样您就可以回显它以便 a) 检查它的语法正确性和 b ) 验证插入的值是否确实符合您的预期:

cmd = "shutdown -s -f -m " & strline & ...
WScript.Echo cmd
WshShell.Run cmd, 0, False

如果命令产生错误或其他与故障排除相关的输出,您需要使其 window 可见并防止它自动关闭。 运行 带有 cmd /k 的命令并将第二个参数设置为 1,因此您可以检查它生成的输出:

WshShell.Run "%COMSPEC% /k " & cmd, 1, True

运行 同步命令(第 3 个参数设置为 True)防止循环用命令 windows.

淹没您的桌面

另一种显示 window 的方法是将输出重定向到日志文件:

WshShell.Run "%COMSPEC% /c " & cmd & " >> ""C:\path\to\your.log"" 2>&1", 0, True

>> 附加到日志文件(因此它不会在循环中被覆盖),2>&1 包括错误输出。在极少数情况下,程序会在 STDOUT (1) 和 STDERR (2) 以外的句柄上生成输出,您也需要 redirect 这些句柄(3>&14>&1、……)。您仍需要在此处同步 运行 命令以避免对日志文件的并发写入访问。