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

Как можно запустить второй PowerShell скрипт от имени администратора, передав ему массив аргументов, из первого скрипта .ps1? Как можно обойти проблему, возникающую при передаче аргументов, если пути содержат пробелы?
  • 22 июля 2024 г. 7:42
Ответы на вопрос 2
Для передачи массива аргументов в другой PowerShell скрипт можно использовать оператор & для вызова второго скрипта и передать массив в качестве параметра. Пример:

```powershell
$arguments = @("arg1", "arg2", "arg3")
& "SecondScript.ps1" $arguments
```

Для запуска второго PowerShell скрипта от имени администратора с передачей массива аргументов можно использовать команду Start-Process с параметром -Verb RunAs. Пример:

```powershell
$arguments = @("arg1", "arg2", "arg3")
Start-Process -FilePath "powershell.exe" -ArgumentList "-File SecondScript.ps1 $arguments" -Verb RunAs
```

Чтобы обойти проблему с передачей аргументов, содержащих пробелы, необходимо заключить каждый аргумент в кавычки при формировании массива аргументов. Например:

```powershell
$arguments = @('"arg 1"', '"arg 2"', '"arg 3"')
& "SecondScript.ps1" $arguments
```

Это позволит корректно передать аргументы со строками, содержащими пробелы, во второй скрипт.
Вы слишком много хотите от 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, а можно будет просто вызывать из первого
Похожие вопросы