Как избежать предшествующего пробела при расширении переменной Powershell
В основном я пытаюсь собрать сценарий удаления IE11. Я нашел это руководство от Microsoft: руководство по удалению IE11 Но вместо этого я хочу сделать это с 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 ответа
Ваша проблема здесь в том, что 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:
с последующим выражением. Последний имеет одну строку, указанную в кавычках и $(...)
может содержать любое выражение.
Так что это сценарий, который удалил пробел. Теперь мне нужно, чтобы 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"