@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 от имени администратора и передать ему массив аргументом?
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 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 знаков), сверх которого она просто обрезается и соответственно вызывает ошибку. Поэтому если ваш скрипт большой, то тут только вызов из отдельного файла
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы