我在我们的服务器批处理文件登录脚本中使用了几行单行 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""