扩展Powershell变量时如何避免前置空格

时间:2014-12-12 06:38:30

标签: powershell dism

基本上我正在尝试整理一个IE11卸载脚本。 我从Microsoft找到了这个指南: IE11 Uninstall guide 但我想用Powershell和DISM代替它,因为pkgmgr已被删除。

我把以下脚本放在一起:

# Get list of IE11 related components to remove
$filenames = Get-ChildItem -Path $env:windir\servicing\Packages | Where-Object { $_.Name -clike "Microsoft-Windows-InternetExplorer-*11.*.mum" }


# Use DISM to remove all the components found above
foreach ($filename in $filenames)
{
    Dism.exe /Online /Remove-Package /Packagepath:($filename.FullName) /quiet /norestart
}

我的问题是DISM命令会失败,因为/ Packagepath:参数无法读取路径。上面的代码将解析路径:.... / Packagepath:C:\ Windows ....在":"之间给我一个空格。和路径。

有什么方法可以避开那个空间,或者删除那个空间?

感谢。

2 个答案:

答案 0 :(得分:0)

所以这是删除了前导空格的脚本。现在我只需要让DISM玩得很好:

# Get list of IE11 related components to remove
$filenames = Get-ChildItem -Path $env:windir\servicing\Packages | Where-Object { $_.Name -clike "Microsoft-Windows-InternetExplorer-*11.*" }

# Use DISM to remove all the components found above
foreach ($filename in $filenames)
{

$FullFilePath=$filename.Fullname

Dism.exe "/Online /Remove-Package /Packagename:$FullFilePath /quiet /norestart"

答案 1 :(得分:0)

你的问题是Powershell将/Packagepath:($filename.FullName)解释为两个独立的参数,第一个是固定字符串/Packagepath:,第二个是评估$filename.FullName的管道。插入空格以分隔参数。

解决方案是通过将其括在引号中并使用$(...)来评估子表达式来告诉Powershell您有一个字符串表达式。

PS C:\> $a = 'x'
PS C:\> cmd /c echo /abc:$a
/abc:x
PS C:\> cmd /c echo /abc:($a)
/abc: x
PS C:\> cmd /c echo "/abc:$($a)"

第一个echo类似于您找到的解决方案:您有一个参数,Powershell将其解释为一个字符串。第二个用字符串/abc:后跟表达式来说明问题。最后一个字符串使用引号明确显示,$(...)可以包含任何表达式。