我正在为一个类编写脚本,该类将查看网络上的每台计算机,然后关闭每台计算机。我有脚本的第一部分工作。但是,脚本的第二部分似乎没有做任何事情。
以下是脚本中无效的部分。
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
答案 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>&1
,4>&1
,...)。您仍然希望在此处同步运行该命令,以避免对日志文件的并发写访问。