将多行脚本从另一个PowerShell传递到PowerShell?

时间:2018-08-28 18:26:53

标签: c# powershell escaping quoting

我是Powershell的新手,我发现很难告诉我的第一个powershell命令行(powershell_1):启动新的powershell命令行(powershell_2)并让它(powershell_2)执行我的多行脚本(在powershell下编写)。

我的脚本是:

$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop;
$wshell.Popup("Are you looking at me?",0,"Hey!",48+4);

我用来启动第一个powershell命令行并按预期工作的代码

    Process powershell_1 = new Process();
    powershell_1.StartInfo.FileName = "powershell";

    string argPowershell_2 = "help";

    powershell_1.StartInfo.Arguments = "Start-Sleep -Milliseconds 500; start powershell -argumentlist \" "+ argPowershell_2 + " \"";
    MessageBox.Show(powershell_1.StartInfo.Arguments);

    powershell_1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    powershell_1.Start();

在上面的示例中,我可以告诉第二个命令行在第二个命令行中执行帮助。我正在寻找一种避免引号问题并以正确的方式告诉它如何执行myscript的好方法。

编辑

Ps:我没有试图将someScript.ps的路径传递给第二个powershell命令行。我想按字面传递多行格式。

2 个答案:

答案 0 :(得分:0)

我不知道这是不是正确的方法,但是您可以对下面的代码进行同样的操作

$argPowershell_2 = "help";
Start-Process -Wait powershell -ArgumentList "Start-Sleep -Milliseconds 500; start powershell -argumentlist $argPowershell_2" 

答案 1 :(得分:0)

解决方案

在我的情况下,传递给我的powershell_1进程的参数可能是:

start powershell -argumentlist "-noexit","start-job -scriptblock { help; start-sleep 1;}

使用这一行代码,并通过在新的powershell进程中跟踪后台作业,我得到了以下结果:

(get-job).childjobs | select * to track job results

如果需要,可以在脚本块中运行类似的操作(声明变量,定义/调用自定义函数等):

$a = new-object System.net.webclient;
$a.downloadfile('https://www.stackoverflow.com','d:\file');

您需要使用转义美元符号($)以及任何其他双引号(“) 字符。

start powershell -argumentlist "-noexit","start-job -scriptblock { `$a = new-object system.net.webclient; `$a.downloadfile('https://www.stackoverflow.com','d:\file');}

有关后台作业的更多详细信息,请参见下面的链接。这解决了我的问题。谢谢大家。

PowerShell: Start-Job -scriptblock Multi line scriptblocks?