Передача многострочного сценария в PowerShell из другого PowerShell? - PullRequest
0 голосов
/ 28 августа 2018

Я новичок в 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.

EDIT

PS: я не пытаюсь передать путь к файлу someScript.ps во вторую командную строку powershell. Я хочу передать это буквально, в многострочном формате.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Решение

В моем случае аргумент для передачи моему процессу 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 Многострочные скриптовые блоки?

0 голосов
/ 28 августа 2018

Я не знаю, правильно ли это, но вы можете сделать то же самое с кодом ниже

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