@Drovosek01

Как из скрипта ps1 запустить другой powershell скрипт ps1 и передать ему массив аргументом?

Текущий вопрос немного соседствует с другим - Как из скрипта ps1 запустить от имени администратора другой powershell скрипт ps1 и передать ему параметры если в путях есть пробелы?
Мне необходимо из одного (первого) скрипт вызвать/выполнить от имени администратора второй скрипт - https://gist.github.com/Drovosek01/9d47068365ea0bc... передав ему аргументы для работы.

Второй скрипт вторым аргументом принимает массив строк, например "1122/3344","5566/7788","9988/7766" и если передавать их вручную вызывая скрипт в консоли Powershell то все без проблем работает.

Но если запустить второй скрипт от имени администратора, например так:
Start-Process powershell -ArgumentList "-noexit -File "D:\TEMP\script.ps1" -filePath `"D:\test\other folder\file.exe`" -patterns", "`"1122/3344`",`"5566/7788`",`"9988/7766`""

То значение последнего аргумента распознается как 1 строка, а не как массив.

Как из скрипта ps1 запустить другой powershell скрипт ps1 от имени администратора и передать ему массив аргументом?
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MaxKozlov Куратор тега PowerShell
Вы слишком много хотите от Start-Process :)
Это просто winapi, которое не знает о том, что в качестве аргумента может быть не строка.
Поэтому всё упирается в интерпретатор параметров, который в вызываемом скрипте.

Я в своём примере в том самом вопросе не зря в called добавил ещё и вывод $args
Если в первом скрипте аргументы формировать как
$argumentList = '-noprofile', '-noexit', '-File', 'd:\called.ps1', "-FilePath `"$filepath`""
$argumentList += $patterns

А второй сделать как
param(
  [string]$FilePath #,
#  [array]$Patterns
)

То во втором именно в $args попадёт содержимое массива
Но по любому второй скрипт должен знать, что ему куда передают

Поэтому я такую проблему решал бы вообще с другой стороны :)

Достаточно добавить в запускающий скрипт #requires -RunAsAdministrator
и тогда запускаемому можно передавать всё что угодно, ведь его не надо будет запускать через
Start-Process, а можно будет просто вызывать из первого
Ответ написан
@denilenko
Недавно улучшал под себя Sophia Script и столкнулся в том числе и с похожей проблемой. Сути сейчас не вспомню, но если интересно самому разобраться, то тут только по старинке, отладкой с временными переменными, чтобы видеть полностью как выглядит вызов второго скрипта. Проблема там именно в разнообразии вариантов определения строк: '', "", """""", '''''' и пр. В процессе дополнительных вызовов одного повершелл скрипта из другого и возникают ошибки (с нашей точки зрения) экранирования.
Помню что получалось вызывать скрипт из отдельного файла, но чувство прекрасного требовало чтобы все было в одном файле, поэтому у меня получился такой вариант:
$UnpinEdge = {
    function Unpin
    {
        param
        (
            [string]$user_profile,
            [string]$unpin_cmd
        )
        if (Test-Path -Path """$user_profile\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Microsoft Edge.lnk""")
        {
            $Shell = (New-Object -ComObject Shell.Application).NameSpace("""$user_profile\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar""")
            $Shortcut = $Shell.ParseName('Microsoft Edge.lnk')
            $Shortcut.Verbs() | Where-Object -FilterScript {$_.Name -eq $unpin_cmd} | ForEach-Object -Process {$_.DoIt()}
        }
    }
}
Start-Process -Credential $LOGGED_USER_CRED -FilePath PowerShell -ArgumentList "-Command & {$UnpinEdge Unpin -user_profile '$LOGGED_USER_PROFILE' -unpin_cmd '$UnpinFromTaskbarCmd'}" -Wait -WindowStyle Hidden

-Credential $LOGGED_USER_CRED замените на -Verb RunAs (у меня просто обратная ситуация: скрипт запускается под админом, а где надо берутся данные залогиненного в системе пользователя). И самое главное: у скриптблока ($UnpinEdge) есть ограничение на длину строку (около 700-800 знаков), сверх которого она просто обрезается и соответственно вызывает ошибку. Поэтому если ваш скрипт большой, то тут только вызов из отдельного файла
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы