0

我必须处理一个 vbs 脚本。我不得不承认我只有 c# 经验,对以下内容一无所知,从我的角度来看,更多的是 SysAdmin Powerhell VBS 脚本。

  1. 这里或一般意义上的“说”是什么?vbcrlf 似乎是将光标置于新行开头的某种常量?

    say(vbcrlf)
    
    say("Some text...")
    
    ws.Run "C:\whatever.exe /PACK-* /SEND /Q", , True
    
    say(vbcrlf)
    
  2. 这里的 ws.run 任务是什么?只需启动并运行 scsript.exe?

    set ws = CreateObject("Wscript.Shell")
    
    if ucase(right(wscript.fullname,11)) = "WSCRIPT.EXE" then
    
    task = "cscript.exe " & chr(34) & wscript.scriptfullname & chr(34)
    
    ws.run task
    
    wscript.quit
    
    end if
    

感谢您对此的任何帮助!

编辑:

问题是该脚本在 XP 上运行起来就像一个魅力,但在 Win7 上却没有。我认为它必须与路径中的空格有关。这是我正在处理的确切路径。我需要用额外的双引号将它们括起来还是 chr(34) 要走的路?

    ws.Run "C:\Program Files (x86)\whatever.exe /PACK-* /SEND /Q", , True

编辑:

好的,我明白了->

    ws.Run """C:\Program Files (x86)\whatever.exe"" /PACK-* /SEND /Q", , True
4

2 回答 2

1

vbCrLf是一个由回车和换行组成的预定义字符串常量:

>> WScript.Echo Asc(vbCrLf), Asc(Right(vbCrLf, 1))
>>
13 10

字符串常量

say不是原生 VBScript;它必须是用户定义的 Sub:

>> Sub say(x) : WScript.Echo x : End Sub
>> say "pipapo"
>>
pipapo

(您的示例中的参数列表()违反了规则:调用子时不要使用参数列表())

.Run是 WScript.Shell 对象的方法(函数);它执行/运行一个外部进程。在您的示例中,它用于(作为子)使用 * c *script.exe 主机(而不是 * w *script.exe)重新启动脚本。

参见WshShell 对象.Run 方法

附言

如果您使用 .Run(或 .Exec),最好将 first/strCommand 参数构建到一个变量中,以便从命令提示符进行检查和测试。“毫无意义地创建一个变量以使用额外的内存,减慢脚本,并使脚本更难阅读”的论点在粘土取代石头用于信息存储后不久就过时了。

于 2013-11-08T23:45:04.070 回答
0
'Connects to COM object WScript.Shell
set ws = CreateObject("Wscript.Shell")

'Testing what script engine is running the script, if the GUI one then do the following. wscript object is always available in wscript/cscript run scripts
if ucase(right(wscript.fullname,11)) = "WSCRIPT.EXE" then

'Pointlessly create a variable to use extra memory, slow down the script, and to make script harder to read
task = "cscript.exe " & chr(34) & wscript.scriptfullname & chr(34)

'Run the current script in the console version of the scripting host
ws.run task

'quits the script leaving the console version to run
wscript.quit

end if
于 2013-11-08T23:48:33.180 回答