команда powershell для переустановки одного приложения Windows 10

команда powershell для переустановки одного приложения Windows 10

Я использую несколько однострочных команд 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""

Связанный контент