在JScript中创建Powershell引用

在JScript中创建Powershell引用,powershell,jscript,activexobject,Powershell,Jscript,Activexobject,我已经编写了一个相当长的JScript,它需要运行一个Powershell脚本来执行几个cmd let,以便从active directory收集当前用户的邮件地址并将其返回到我的脚本中 var WSH = new ActiveXObject("WScript.Shell"); var PowerShellExec = WSH.exec("powershell.exe -WindowStyle Hidden -NonInteractive -NoProfile -Command \"$WNT =

我已经编写了一个相当长的JScript,它需要运行一个Powershell脚本来执行几个cmd let,以便从active directory收集当前用户的邮件地址并将其返回到我的脚本中

var WSH = new ActiveXObject("WScript.Shell");
var PowerShellExec = WSH.exec("powershell.exe -WindowStyle Hidden -NonInteractive -NoProfile -Command \"$WNT = New-Object -ComObject WScript.Network;$ADSearcher = New-Object System.DirectoryServices.DirectorySearcher;$ADSearcher.Filter = 'name=' + $WNT.UserName;$User = $ADSearcher.FindOne();$UserMail = $User.Properties.Item('mail');Write-Output $UserMail\"");
PowerShellExec.StdIn.Close();
while (PowerShellExec.Status == WshRunning)
{
    WScript.Sleep(10);
}
var UserMail = PowerShellExec.StdOut.ReadAll(); //Data stored in $SomeValue
我的问题是,有一个短暂的时刻,PowerShell窗口会弹出。我想避免这种情况,以保持我的脚本沉默。“-WindowStyle Hidden”参数不能完全避免这种情况

是否有一些Powershell ActiveXObject可用于此目的

我希望有点像

var PSSession = new ActiveXObject("Powershell.Application");
PSSession.code = "...";
PSSession.run();
var Result = PSSession.ReadAll();

我知道我可以使用WSH.run完全隐藏我的Powershell窗口,但在再次读取之前,我需要将输出写入某个文本文件。就我个人而言,我不喜欢这样的工作环境……

是否有理由将脚本语言结合起来,而不是只使用PowerShell?是的,每种语言都有它的优缺点,出于某种原因,PowerShell在捕获internet explorer事件时似乎有点不可靠,但在jscript中效果很好。由于我90%的代码都是关于与IE交互的,所以在本例中我选择不在Powershell中编写代码;很抱歉如果您坚持使用WSH脚本而不是PowerShell,我建议您从WSH脚本查询AD,而不是从外部运行PowerShell。或者(如前所述),使用PowerShell重新设计并省去WSH脚本。(不知道你所说的“有点不可靠”是什么意思。)在这种情况下,我不喜欢Powershell的另一个原因是你不能完全安静地运行它(此线程的主要目的是完全避免Powershell窗口很快弹出),而WSH可以有一个控制台(CScript)或完全在后台运行(WScript)根本没有被用户注意到。
var codepage='windows-1251';/*US-Europe-1252 and Js file in that codepage*/
var toPStext='Hello.\nПроверка русских буковок.';
var shell=new ActiveXObject('WScript.Shell');
var std=shell.Exec("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -ExecutionPolicy Bypass -command \
    $OutputEncoding = [Console]::outputEncoding = [System.Text.Encoding]::GetEncoding('"+codepage+"'); \
    Write-Output '"+toPStext+"'");
var output = std.StdOut.ReadAll().split('\r\n');// split('\n') - приводит к потере части данных leads to the loss of some data
if (output.length>0){WScript.echo(output)}
var x=WScript.StdIn.ReadLine();