为何Get-ChildItem的输出可通过管道传递给Copy-Item执行?
关于PowerShell管道传值到Copy-Item的疑问解答
你遗漏了两个关键的PowerShell管道绑定细节:
FileSystemInfo对象的隐式字符串转换
Get-ChildItem输出的System.IO.FileInfo对象,当PowerShell需要把它传给接受字符串类型的参数(比如Copy-Item的-Path)时,会自动调用对象的ToString()方法,而FileInfo的ToString()返回的就是文件的完整路径字符串,相当于直接把路径传给了-Path参数。PSPath属性的自动绑定
所有PowerShell的文件系统对象(包括FileInfo)都自带PSPath属性,这个属性存储的是PowerShell格式的完整路径(比如Microsoft.PowerShell.Core\FileSystem::C:\test\file.txt)。Copy-Item的-Path参数支持通过ByPropertyName绑定到PSPath属性——PowerShell会自动匹配对象的PSPath属性到-Path参数,这也是管道能生效的核心原因之一。
另外补充:Copy-Item的-Path参数本质上也支持直接接收FileSystemInfo类型的对象(FileInfo是它的派生类),所以也符合ByValue绑定的逻辑,只是参数定义里写的是string[],但PowerShell会自动处理兼容类型的隐式转换。你可以直接验证这一点:
$file = Get-ChildItem .\test.txt Copy-Item -Path $file -Destination .\Wonderland\
内容的提问来源于stack exchange,提问作者The One
相关产品推荐
相关产品推荐

