我试图在两个管道中写入输出(回声),以跟踪我在做什么,但出现错误。
Get-ChildItem $path -Recurse |
Where-Object { $_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate } |
Write-Output "deleting file" -PassThru |
Remove-Item
但是我有这个错误:
Write-Output:输入对象不能绑定到该命令的任何参数,因为该命令没有采用管道输入,或者该输入及其属性与采用管道输入的任何参数都不匹配。
我也在Foreach-Object函数中进行了测试
Get-ChildItem $path -Recurse |
Where-Object { $_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate } |
Foreach-Object {
echo "deleting $($_.Name)";
Remove-Item($_);
}
但是控制台中什么也没打印(但是脚本没有错误地结束并且删除了我想要的文件)
那么我该如何打印到两个管道的输出?
Thx
答案 0 :(得分:2)
写入输出将输出发送到管道。它通过管道或参数接受输入,但不能同时接受两者,因此您可以执行以下操作:
Write-Output "Test"
或者这个:
"Test" | Write-Output
但不:
"Test" | Write-Output "Test"
解决方案:
Get-ChildItem $path -Recurse | where {
$_.Name -match '.+?\.log\.(\d{4})-(\d{2})-(\d{2})$' -and $_.LastWriteTime -lt $deleteDate
} | foreach {
# Write-Host writes to the console only
Write-Host "Deleting $($_.Name)"
Remove-Item $_
}
请注意,删除项需要一个字符串参数,因此您传递的所有内容都会转换为字符串。将FileInfo
对象转换为字符串可能并不总是返回完整路径(由于ToString()
的实现),具体取决于创建方式!
在上面的示例中,可以安全使用,但是例如,它将引发异常(如果您当前的工作目录不是$path
):
(Get-Item $path).GetFiles() | foreach { Remove-Item $_ }
因此,使用$_.FullName
总是最安全的。