Путь Foreach найден в переменной remove-item - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблема с удалением файлов (Полный путь) в переменной, которая должна содержать несколько путей. У меня есть несколько установщиков, одна и та же программа, разные версии в папке. Я хочу сохранить последнюю версию и удалить более старые. Я дошел до этого, но, как вы, вероятно, видите из сценария, я не настолько опытен.

$InstallersLocs = (Get-ChildItem -Path "$DesktopPath\PS\Installers" -Recurse -Include *.exe | Select-Object FullName, LastWriteTime | Where-Object {$_.FullName -match 'Installer'} | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 | Select-Object FullName |  Format-Table -AutoSize | Out-String).Replace("FullName", "").Replace("--------", "").Trim()
  foreach ($InstallersLoc in $InstallersLocs) {
        Write-Output "Removing $InstallersLoc" 
      $Files += $InstallersLoc | Remove-Item -Confirm:$false -Force
    }

Вывод из записи-вывода:

Removing C:\Users\B\Desktop\PS\Installers\Installer Setup 1.0.1.exe
C:\Users\B\Desktop\PS\Installers\Installer Setup 1.0.exe

Я получаю эти ошибки:

Remove-Item : Illegal characters in path.
At line:4 char:34
+       $Files += $InstallersLoc | Remove-Item -Confirm:$false -Force
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\Users\B\... Setup 1.0.exe:String) [Remove-Item], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand

Remove-Item : Cannot find path 'C:\Users\B\Desktop\PS\Installers\Installer Setup 1.0.1.exe

1 Ответ

1 голос
/ 16 апреля 2020

Причиной возникновения этой проблемы являются ... нежелательные ... символы, добавленные с помощью командлетов Format-* и Out-String. удалите их и используйте Select-Object с параметром -ExpandProperty, чтобы получить значение как простой элемент.

вы можете увидеть «материал», добавленный каждым из этих двух командлетов, сохранив вывод в $ Var, а затем посмотрев, что там есть. Например,

, элемент [3] в том, что возвращается Format-Table, выдается красный текст об ошибке ...

"Microsoft.PowerShell.Commands.Internal.Format.GroupEndData"

обратите внимание на Format ... [ ухмылка ]

если вы отправите вывод материала по Out-String на Format-Hex, вы увидите, что он добавляет начальную cr/lf к 1-й строке и еще одну пару к концу каждой строки.

как правило, НЕ ИСПОЛЬЗУЙТЕ ни один из Format-* командлетов ИЛИ Out-String командлет для чего-либо, кроме final вывода на экран ИЛИ final вывод в простой текстовый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...