【问题标题】:PowerShell script that accepts pipeline input?接受管道输入的 PowerShell 脚本?
【发布时间】:2022-01-20 04:39:11
【问题描述】:

需要一些帮助来调整这个将最新文件复制到另一个文件夹的脚本:

$FilePath        = "C:\Downloads\Sales 202112*.xlsx"
$DestinationPath = "C:\myFiles\"

gci -Path $FilePath -File | 
  Sort-Object -Property LastWriteTime -Descending | 
    Select FullName -First 1 |
      Copy-Item $_ -Destination $DestinationPath 

不确定如何为 Copy-Item 命令引用管道输入。

谢谢。

【问题讨论】:

  • 到底是什么问题?什么不符合您的预期?
  • 移除 FullName 和 $_ - Copy-Item 隐式绑定管道输入($_ 仅在脚本块中需要)。
  • 如果我删除以“| Copy-Item”开头的最后一部分,我会得到我感兴趣的最后一个文件名。但是 Copy-Item item 命令不起作用。
  • @mklement0 - 好的,当我删除 FullName 和 $_ 时,脚本按预期工作。不知道您可以指定没有源文件名的 Copy-Item。谢谢!
  • @ggv 但你正在指定源文件名 - 你只是通过管道这样做:)

标签: powershell syntax pipeline


【解决方案1】:

tl;dr

Get-ChildItem -Path $FilePath -File |
  Sort-Object -Property LastWriteTime -Descending | 
    Select-Object -First 1 | # Note: No 'FullName'
      Copy-Item -Destination $DestinationPath # Note: No '$_'

最简单、最可靠的方法是将Get-ChildItem / Get-Item 输出按原样发送到其他文件处理cmdlet,后者绑定到后者的@ 987654334@参数,即输入文件路径。


至于你尝试了什么:

  • automatic $_ variable,明确指手头的管道输入对象,仅在传递给 cmdlet 的 script blocks ({ ... }) 中需要(并且受支持)。

  • 使用合适的管道输入,PowerShell隐式将其绑定到目标 cmdlet 的管道绑定参数,在上面的 Copy-Item 调用的情况下为 -LiteralPath。换句话说:没有必要将目标参数的值指定为 argument。

    • This answer 解释了将Get-ChildItem 输出的System.IO.FileInfo 和System.IO.DirectoryInfo 实例绑定到Copy-Item 等文件处理cmdlet 的-LiteralPath 参数的机制。

    • 请注意,由于FullName 不在图片中(见下文),它确实是Copy-Item 作为管道输入接收的System.IO.FileInfo 实例,因为上面的Sort-Object ... 和Select-Object -First 1 调用将它们通过不改变他们的类型。

  • 选择FullName 属性试图通过管道仅传递文件的完整路径(作为字符串)是不必要的,更重要的是:

    • 它失败,除非你使用-ExpandProperty FullName来确保只输出属性value;没有它,您将获得一个具有.FullName 属性 的对象 - 请参阅this answer 了解更多信息。
    • 即使你解决了这个问题,解决方案 - 至少假设 - 不如作为一个整体传递 System.IO.FileInfo 实例:仅仅 string 输入绑定到-Path 而不是 -LiteralPath 参数,这意味着根据定义将 literal 路径解释为 wildcard 表达式,这会导致对包含 [ 字符的文字路径的错误处理(例如c:\foo\file[1].txt)。
    • 请参阅this answer,了解如何检查任何给定 cmdlet 的管道绑定参数的细节。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2013-10-10
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-12-02
    • 2022-10-21
    相关资源
    最近更新 更多