写到两个管道之间的输出

时间:2018-11-19 09:54:20

标签: powershell pipe echo

我试图在两个管道中写入输出(回声),以跟踪我在做什么,但出现错误。

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

1 个答案:

答案 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总是最安全的。