[英]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.FileInfo
和System.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
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.