我在伺服器批次檔登入腳本中使用了幾個一行 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
關於Add-AppxPackage
應該是內插字串的參數有單引號。要轉義批次檔中的雙引號,您需要使用兩個連續的雙引號(即""
)。換句話說,替換
-Register '$($_.InstallLocation)\AppXManifest.xml'
和
-Register ""$($_.InstallLocation)\AppXManifest.xml""