Подстановка переменных внутри блока сценариев PowerShell запускается от имени администратора - PullRequest
0 голосов
/ 02 октября 2018

Я пишу код в PowerShell.Я хочу изменить порт в файле конфигурации как администратор, но он не работает.

Вот мой код:

$port=8888

$ScriptBlock = {
    function bar($port) {
        $config = Get-Content -Path "c:\Users\Me\foo.xml"
        $NewConfig = $Config -replace 'httpPort=[0-9]*\s',"httpPort=$port "
        Set-Content -Path c:\ProgramFiles(x86)\foo.xml -Value $NewConfig -Force
    }
};
Start-Process -FilePath powershell.exe -ArgumentList $ScriptBlock,"bar('$port')" -Verb RunAs -Wait

Я думаю, что у него проблемы со второй частью -replace ("httpPort = $ port").

Что яотсутствует

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете попробовать следующее:

Start-Process -Verb RunAs -Wait -FilePath powershell.exe -ArgumentList '-Command',
  "$($ScriptBlock -replace '"', '\"'); bar $port"

В качестве отступления:
* Регулярное выражение, которое вы используете для сопоставления с номером порта, предполагает, что это без кавычек значение атрибута, которое, хотя и допустимо в HTML , не является правильно сформированным XML .
* Не вызывайте вашу функцию с синтаксисом метода (bar($port)) - Функции PowerShell вызываются как команды оболочки, без скобок и с аргументами, разделенными пробелами, а не ,: bar $port

Что касается того, что вы пытались:

  • Start-Process неизменно интерпретирует аргументы, переданные в -ArgumentList, как строки , и хотя блок скрипта удобно преобразуется в его содержимое буквальной строки, вам необходимо экранировать встроенный " персонажикак \" (sic), чтобы целевой экземпляр PowerShell мог правильно их распознать с помощью опции (подразумеваемой в Windows PowerShell) -Command.

  • Поскольку -Command просто объединяет всеПоследующие аргументы с пробелом в качестве разделителя перед , интерпретирующие результирующую строку как фрагмент исходного кода PowerShell, как правило, для концептуальной ясности предпочтительно передавать одну строку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...