我在删除应该包含多个路径的变量中的文件(完整路径)时遇到问题。我在一个文件夹中有多个安装程序,相同的程序,不同的版本。我想保留最新版本并删除旧版本。我走到了这一步,但正如你可能从剧本中看到的那样,我没有那么有经验。
$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-String
cmdlet 添加的字符。删除这些并将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-String
cmdlet 用于除最终输出到屏幕或最终输出到纯文本文件以外的任何内容。