关闭远程计算机无法正常工作

时间:2015-10-09 22:50:57

标签: vbscript shutdown

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

以下是脚本中无效的部分。

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

1 个答案:

答案 0 :(得分:0)

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

  

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

     

<强>参数
  [...]
   -m [\\ ComputerName]:指定要关闭的计算机    -t xx:在xx秒内设置系统关闭的计时器。默认值为20秒    -c“message”:指定要在“系统关闭”窗口的“消息”区域中显示的消息。最多可以使用127个字符。您必须将邮件括在引号中。

无论您使用的格式-p还是/p都无关紧要,shutdown.exe同时接受这两种格式。

如果您提供IP地址作为参数-m的参数,则不需要前导\\,并且只有文本时才需要围绕参数-c的参数的双引号包含空格。不过,他们不会受到伤害。

此外,使用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

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

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

同步运行命令(第3个参数设置为True)可防止循环使命令窗口充斥您的桌面。

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

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

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