単一の Windows 10 アプリを再インストールするための PowerShell コマンド

単一の Windows 10 アプリを再インストールするための PowerShell コマンド

サーバーのバッチ ファイル ログイン スクリプトで 1 行の 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

PowerShell では、一重引用符で囲まれた文字列 (リテラル文字列) は、二重引用符で囲まれた文字列 (補間文字列) とは少し異なる方法で処理されます。

これを理解するには、次のことを考えてみてください。

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

出力は次のようになります:

Hello $name
Hello Jones

変数が一重引用符(リテラル)文字列では展開されず、二重引用符(補間文字列)では展開されていることに注意してください。

Register問題に戻ると、引数に挿入文字列を囲む一重引用符があることが問題ですAdd-AppxPackage 。バッチファイルで二重引用符をエスケープするには、2つの連続した二重引用符(つまり )を使用する必要があります""。つまり、

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

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

関連情報