Задать вопрос
@Drovosek01

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

Пишу скрипт на языке Powershell.
Скрипт-обертка который делает "черновую работу" и запускает другой скрипт (https://gist.github.com/Drovosek01/9d47068365ea0bc...) передав ему сформированные аргументы

Сначала я делал это с помощью такой команды:
& "$patcherFile" -filePath "$targetFile" -patterns @($patterns)

Но потом появилась необходимость запускать этот скрипт от имени администратора.
Я погуглил и один из популярных способов сделать это - выполнить команду Start-Process с параметром -Verb RunAs помимо прочих.

Собственно новая команда получилась такая:
Start-Process powershell -Verb RunAs -ArgumentList "-noexit -File $patcherFile -filePath $targetFile -patterns $patterns"
но при выполнении этой команды появляется окно Powershell и моментально закрывается.

Если вместо переменных в команде использовать непосредственно текст, например
Start-Process powershell -Verb RunAs -ArgumentList "-noexit -File D:\test\another folder\patcher.ps1 -filePath D:\test folder\with test file\myfile.exe -patterns 11223344/55667788"

То происходит тоже самое.

Если в этой команде пути дополнительно обернуть в кавычки, например так:
Start-Process powershell -Verb RunAs -ArgumentList "-noexit -File", '"D:\test\another folder\patcher.ps1"', "-filePath", '"D:\test folder\with test file\myfile.exe"', "-patterns 11223344/55667788"

Тогда все выполняется без проблем.

Но я не могу так сделать, потому что эти значения получаю динамически и они хранятся в переменных.

Если переменные обернуть в одинарные кавычки - они перестанут быть переменными и будут распознаваться непосредственно как текст.

Как решить проблему?

P.S.
Экранировать одиночные кавычки "\'$patcherFile\'" в данном случае тоже нельзя, потому что это приводит к изначальному результату - окно с новым процессом Powershell открывается и моментально закрывается
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Drno
Делай как в линукс.. задай вначале скрипта переменную, а в теле запроса укажи "переменная"
Ответ написан
@MaxKozlov Куратор тега PowerShell
Варианты бывают разные, По сути то же, что и в комментариях, но выглядит чуть более аккуратно :)
Особенно хорош вариант с -EncodedCommand, потому что там можно хоть целый скрипт написать

call.ps1
$filepath = "D:\test folder\with test file\myfile.exe"
$patterns = "11223344/55667788"

$argumentList = '-noprofile', '-noexit', '-File', 'd:\called.ps1', "-FilePath `"$filepath`"", "-patterns `"$patterns`""

Start-Process powershell -Verb RunAs -ArgumentList $argumentList

# Специально многострочный пример
$command = @"
d:\called.ps1 -FilePath `"$filepath`" -patterns `"$patterns`"
"@
$encodedCommand = [convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($command))

Start-Process powershell -Verb RunAs -ArgumentList '-noprofile -noexit -EncodedCommand', $encodedCommand


called.ps1
#requires -RunAsAdministrator

param(
  $FilePath,
  $Patterns
)
Write-Host "FilePath: >$FilePath<"
Write-Host "Patterns: >$Patterns<"

foreach ($a in $args) {
   Write-Host "Argument: >$a<"
}
Write-Host "---"
Ответ написан
Ваш ответ на вопрос

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

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