Eu uso vários comandos powershell de uma linha no script de login de arquivo em lote de nossos servidores, mas não consigo descobrir o que estou fazendo de errado com este.
powershell.exe -ExecutionPolicy Bypass -Command "Get-AppxPackage -allusers *Windows.Photos* | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register '$($_.InstallLocation)\AppXManifest.xml'}"
Quando tento executar isso, recebo o erro: Não é possível encontrar o caminho 'C:\$($_.InstallLocation)\AppXManifest.xml'
Suponho que há um problema com a citação no comando, mas tentei maneiras diferentes e não consigo fazê-lo funcionar. Se eu executar o comando abaixo em um prompt do PowerShell, ele funcionará bem.
Get-AppxPackage -allusers *Windows.Photos* | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
Eu gostaria de evitar ter que criar um arquivo .ps1 separado e mantê-lo em uma única linha, se possível.
Responder1
No PowerShell, strings entre aspas simples (strings literais) são tratadas de maneira um pouco diferente daquelas entre aspas duplas (strings interpoladas).
Para ver isso, considere o seguinte
$name = "Jones"
'Hello $name'
"Hello $name"
Isso produzirá:
Hello $name
Hello Jones
Observe como a variável não foi expandida na string entre aspas simples (literal), mas foi expandida na string entre aspas duplas (string interpolada)
Voltando ao seu problema, o problema é que o Register
argumento on Add-AppxPackage
tem aspas simples em torno do que deveria ser uma string interpolada. Para escapar das aspas duplas em um arquivo em lote, você precisará usar duas aspas duplas consecutivas (ou seja, ""
). Em outras palavras, substitua
-Register '$($_.InstallLocation)\AppXManifest.xml'
com
-Register ""$($_.InstallLocation)\AppXManifest.xml""