Vbscript JScript:标识是否将双引号传递给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

在某些情况下,确定双引号是否作为参数传递给WSH脚本非常重要。例如,因为它们应该传递给另一个要运行的可执行文件

标准解析函数/对象:

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