Я использую несколько однострочных команд 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
В PowerShell строки в одинарных кавычках (литеральные строки) обрабатываются немного иначе, чем строки в двойных кавычках (интерполированные строки).
Чтобы увидеть это, рассмотрим следующее
$name = "Jones"
'Hello $name'
"Hello $name"
Это выведет:
Hello $name
Hello Jones
Обратите внимание, что переменная не была расширена в строке, заключенной в одинарные кавычки (литеральной), но была расширена в строке, заключенной в двойные кавычки (интерполированной строке).
Возвращаясь к вашей проблеме, проблема в том, что Register
аргумент on Add-AppxPackage
имеет одинарные кавычки вокруг того, что должно быть интерполированной строкой. Чтобы экранировать двойные кавычки в пакетном файле, вам нужно будет использовать две последовательные двойные кавычки (т.е. ""
). Другими словами, замените
-Register '$($_.InstallLocation)\AppXManifest.xml'
с
-Register ""$($_.InstallLocation)\AppXManifest.xml""