Я использую несколько однострочных команд powershell в нашем сценарии входа в пакетный файл на наших серверах, но я не могу понять, что я делаю не так с этим.

powershell.exe -ExecutionPolicy Bypass -Command "Get-AppxPackage -allusers *Windows.Photos* | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register '$($_.InstallLocation)\AppXManifest.xml'}"

Когда я пытаюсь запустить это, я получаю сообщение об ошибке: Не удается найти путь 'C:\$($ _.INSTALLLOCATION)\AppXManifest.xml»

Я предполагаю, что есть проблема с цитированием в команде, но я пробовал разные способы и не могу заставить его работать. Если я запускаю команду ниже из командной строки powershell, она работает нормально.

Get-AppxPackage -allusers *Windows.Photos* | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}

Я хотел бы избежать создания отдельного файла .ps1 и держать его в одной строке, если это возможно.

1 ответ1

1

В powershell строки в одинарных кавычках (литеральные строки) обрабатываются немного иначе, чем в двойных кавычках (интерполированные строки).

Чтобы увидеть это, рассмотрим следующее

$name = "Jones"
'Hello $name'
"Hello $name"

Это выведет:

Hello $name
Hello Jones

Обратите внимание, что переменная не раскрывалась в строке с одинарными кавычками (литералом), а раскрывалась в строке с двойными кавычками (интерполированная строка)

Возвращаясь к вашей проблеме, проблема в том, что аргумент Register в Add-AppxPackage содержит одинарные кавычки, которые должны быть интерполированной строкой. Чтобы избежать двойных кавычек в пакетном файле, вам нужно использовать две последовательные двойные кавычки (то есть ""). Другими словами, заменить

-Register '$($_.InstallLocation)\AppXManifest.xml'

с

-Register ""$($_.InstallLocation)\AppXManifest.xml""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .