Vbscript 关闭不工作的远程计算机

Vbscript 关闭不工作的远程计算机,vbscript,shutdown,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 te

我正在为一个类编写脚本,该类将查看网络上的每台计算机,然后关闭每台计算机。我已经完成了剧本的第一部分。然而,脚本的第二部分似乎没有做任何事情

下面是脚本中不起作用的部分

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

正如其他人已经指出的,您需要一个空格shutdown命令的参数需要在它们和它们的参数之间留一个空格。从:

语法 关机[{-l |-s |-r |-a}][-f][m[\\ComputerName]][-t xx][-c消息][d[u][p]:xx:yy]

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

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

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

另外,使用cmd.exe运行命令是可选的,因为shutdown是一个可执行文件,而不是像dir这样的cmd内置命令,并且您不使用任何特定于cmd的命令,比如输出重定向

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

"shutdown -s -f -m " & strline & " -c """ & strWarning & """ -t " & strDelay
"shutdown -s -f -m \\" & strline & " -c """ & strWarning & """ -t " & strDelay
或者,如果您使用的是主机名而不是IP地址,如下所示:

"shutdown -s -f -m " & strline & " -c """ & strWarning & """ -t " & strDelay
"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
同步运行命令时,第三个参数设置为True,可防止循环使用命令窗口淹没桌面

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

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

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

arg样式的开关是否更适合您?我尝试了/arg和-arg,但似乎两者都不起作用。但你的文章确实提到了我的剧本正在做的事情。它在弹出窗口中循环WScript.Echo Shutdown完成,即使我正在通过CLI中的CScript执行它。是否缺少-m和计算机名之间的空格?不要运行该命令,而是将其输出到屏幕,然后尝试按原样从cmd运行该命令,以查看其是否有效。我认为这是命令中的语法问题,而不是VBS issue.cmd.exe/c shutdown-s-f-m\\&strline&/c&strWarning&/t&strDelay@Bob是正确的。可疑停机开关的语法为/m\\computer和/c comment。不知道斯特林、斯特尔瓦宁和斯特德雷的情况就没什么可说的了。谢谢大家!!!你是个救生员!!我以为变量strline在字符串中包含//但事实并非如此。因此,通过在shutdown命令中添加空格和//使其工作。再次感谢!!!