Как избежать предшествующего пробела при расширении переменной 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"
Другие вопросы по тегам