对于在变量删除项中找到的每个路径



我在删除应该包含多个路径的变量中的文件(完整路径)时遇到问题。我在一个文件夹中有多个安装程序,相同的程序,不同的版本。我想保留最新版本并删除旧版本。我走到了这一步,但正如你可能从剧本中看到的那样,我没有那么有经验。

$InstallersLocs = (Get-ChildItem -Path "$DesktopPathPSInstallers" -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:UsersBDesktopPSInstallersInstaller Setup 1.0.1.exe
C:UsersBDesktopPSInstallersInstaller 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:UsersB... Setup 1.0.exe:String) [Remove-Item], ArgumentException
+ FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot find path 'C:UsersBDesktopPSInstallersInstaller Setup 1.0.1.exe

您遇到此问题的原因是...多余。。。由Format-*Out-Stringcmdlet 添加的字符。删除这些并将Select-Object-ExpandProperty参数一起使用,以将值作为简单项获取。

通过将输出保存到$Var,然后查看其中的内容,可以看到这两个 cmdlet 中的每一个添加的"内容"。

例如,Format-Table返回的内容中的[3]项会为您提供有关...

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

请注意Format...[咧嘴一笑]

如果您将Out-String的 stuff 输出发送到Format-Hex,您将看到它在第一行中添加了一个前导cr/lf,并在每行的末尾添加了另一对。

作为一般规则,请勿将任何Format-*cmdlet 或Out-Stringcmdlet 用于最终输出到屏幕或最终输出到纯文本文件以外的任何内容。

最新更新