繁体   English   中英

接受管道输入的 PowerShell 脚本?

[英]PowerShell script that accepts pipeline input?

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

$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 命令引用管道输入。

谢谢。

tl;博士

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

最简单和最可靠的方法是pipe Get-ChildItem / Get-Item output按原样绑定到其他文件处理 cmdlet ,它绑定到后者的-LiteralPath参数,即输入文件路径。


至于你尝试了什么:

  • 自动$_变量,它明确地引用了手头的管道输入 object,仅在传递给 cmdlet 的脚本块( {... } ) 内需要(并且受支持)。

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

    • 此答案解释了将Get-ChildItem输出的System.IO.FileInfoSystem.IO.DirectoryInfo实例绑定到文件处理 cmdlet(例如Copy-Item )的-LiteralPath参数的机制。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM