【问题标题】:Write to the output between two pipeline写入两个管道之间的输出
【发布时间】:2018-11-20 15:44:55
【问题描述】:

我正在尝试写入两个管道内的输出(回显)以跟踪我正在做的事情,但我有一个错误。

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($_);
} 

但是这里没有打印在控制台中(但是脚本完成没有错误并删除了我想要的文件)

那么如何在两个管道中打印到输出?

谢谢

【问题讨论】:

  • 这可能意味着您的where 中的条件不适用于任何文件?
  • @marsze 条件正确。当我删除“写入输出管道”时脚本运行良好
  • 在第二个脚本中使用$_ | Remove-Item 或在第一个插入| Tee-Object -Variable Deleted | 而不是Write-Output 和后来的输出$Deleted

标签: powershell pipe echo


【解决方案1】:

Write-Output 将输出发送到管道。它通过管道或参数接受输入,但不能同时接受,所以你可以这样做:

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 $_
}

请注意,Remove-Item 需要一个字符串参数,因此您传递的所有内容都将转换为字符串。将FileInfo 对象转换为字符串可能并不总是返回完整路径(因为它实现了ToString()),具体取决于它的创建方式!

在上面的示例中,使用它是安全的,但是这会抛出异常(如果您当前的工作目录不是$path):

(Get-Item $path).GetFiles() | foreach { Remove-Item $_ }

所以使用$_.FullName 总是最安全的。

【讨论】:

  • 感谢您的回复。关于Remove-Item,显然它可以单独处理$_。无需指定全名。
  • @Zou 这只是部分正确。我已经更新了我的答案,使其更加清晰。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多