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