Vbscript JScript:标识是否将双引号传递给WSH脚本
在某些情况下,确定双引号是否作为参数传递给WSH脚本非常重要。例如,因为它们应该传递给另一个要运行的可执行文件 标准解析函数/对象:Vbscript JScript:标识是否将双引号传递给WSH脚本,vbscript,jscript,wsh,Vbscript,Jscript,Wsh,在某些情况下,确定双引号是否作为参数传递给WSH脚本非常重要。例如,因为它们应该传递给另一个要运行的可执行文件 标准解析函数/对象: objArgs = WScript.Arguments; for (i = 0; i < objArgs.length; i++) { WScript.Echo(objArgs(i)); } 及 有没有可能采用其他方法 注意:我还尝试通过以下几种组合来摆脱它们: cscript foo.js '"bar"' 似乎他们只是被剥夺了权利 以下@Ekk
objArgs = WScript.Arguments;
for (i = 0; i < objArgs.length; i++)
{
WScript.Echo(objArgs(i));
}
及
有没有可能采用其他方法
注意:我还尝试通过以下几种组合来摆脱它们:
cscript foo.js '"bar"'
似乎他们只是被剥夺了权利 以下@Ekkehard.Horner建议: 解决方案 试验 运行
parseArgs.js
将提供:
> cscript //nologo parseArgs.js "hello" world
cscript //nologo parseArgs.js "hello" world
"hello" world
1 "hello"
2 world
"hello",world
该行:
> parseArgs.js "hello" world
给出了类似的结果
评论
我们需要这么复杂的脚本吗?简短回答:否。长:视情况而定
通常,假设您知道脚本运行时的名称,您可以查询WMI以获取它。无论如何,在部署脚本时,通常无法控制部署目录。因此,如果有另一个脚本以相同的名称运行,您无法确定哪一个是您的脚本。
另一种不太常见的情况是,有两个或多个脚本实例正在运行 这里的策略是运行一些隐藏的伪标准Windows可执行文件(
winver.exe
),并向其传递GUID。通过这种方式,可以通过唯一的GUID安全地识别winver.exe
命令行,从而将脚本识别为winver.exe
的父级winver.exe
不需要参数,但如果向其传递参数,则不会提出抗议。您可以获取运行脚本的wscript.exe进程的原始命令行字符串,通过WQL按进程id进行查询。请参阅
// parseArgs.js
// Parsing jscript script arguments verbatim
var Shell = new ActiveXObject("WScript.Shell"),
wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2"),
guid = (new ActiveXObject("Scriptlet.TypeLib")).GUID.substring(0,38),
windir=Shell.ExpandEnvironmentStrings("%WinDir%"),
winver="\"" + windir + "\\System32\\winver.exe\" " + guid,
pcol, pid, cmd;
// Run winver.exe hidden and get this script ID as its ParentProcessId
winver=winver.replace(/\\/g, "\\\\");
Shell.Run("winver " + guid, 0);
pcol = new Enumerator (wmi.ExecQuery(
"SELECT * From Win32_Process WHERE CommandLine='"+ winver + "'",
"WQL", 32));
for (; !pcol.atEnd(); pcol.moveNext()){
var prc = pcol.item();
pid=prc.ParentProcessId;
prc.Terminate;
}
// Get the command line for the found PID
pcol = new Enumerator (wmi.ExecQuery(
"SELECT * From Win32_Process WHERE ProcessID="+ pid,
"WQL", 32));
for (; !pcol.atEnd(); pcol.moveNext()){
var prc = pcol.item();
cmd =prc.CommandLine;
}
WScript.Echo(cmd);
// Parse command line for arguments
var ags,
parseCmd=function(cmd){// WMI trims initial spaces
var p = new Object(),
re =/^"/.test(cmd) ? /"[^"]+" */ : /\S+\s*/;
p.nxt=re.test(cmd) ? cmd.match(re)[0] : ""; // extract next token
p.rst=cmd.replace(re, "") ; // remainder
return(p);
}
// Strip c/wscript path
ags=parseCmd(cmd).rst
//WScript.Echo(ags);
// Remove WSH "//xxx" options
ags=ags.replace(/\/\/\w+ +/g, "")
//WScript.Echo(ags);
// Strip script name and get arguments
ags=parseCmd(ags).rst
WScript.Echo(ags);
// Loop args and store as an array
var i=1, aags=[];
while(ags != ""){
var p =parseCmd(ags);
ags=p.rst;
aags.push(p.nxt.replace(/ +$/, ""));
WScript.Echo(i, p.nxt);
i++;
}
WScript.Echo(aags);
> cscript //nologo parseArgs.js "hello" world
cscript //nologo parseArgs.js "hello" world
"hello" world
1 "hello"
2 world
"hello",world
> parseArgs.js "hello" world