关闭远程计算机不工作
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>&1
、4>&1
、……)。您仍需要在此处同步 运行 命令以避免对日志文件的并发写入访问。
我正在为 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>&1
、4>&1
、……)。您仍需要在此处同步 运行 命令以避免对日志文件的并发写入访问。