PowerShell中$_在路径参数中解析为文件名的原因
PowerShell中FileInfo对象的解析逻辑
你的问题核心是PowerShell对FileInfo对象在不同场景下的自动处理机制,拆解来看:
1. -value $_为何能识别完整源路径
New-Item的-Value参数(创建硬链接时)支持直接接收FileInfo类型的对象——因为这个参数的设计就是为了接受文件系统实体对象或字符串路径。当你传入$_(即gci输出的FileInfo对象)时,PowerShell会直接读取对象的FullName属性(完整路径)来定位源文件,不需要额外转换。
2. -path c:\destdir\$_为何只取文件名
这里属于字符串上下文拼接操作:当你把一个对象嵌入到字符串里(比如和c:\destdir\拼接),PowerShell会自动调用该对象的ToString()方法来获取字符串表示。而FileInfo对象的ToString()方法默认返回的就是它的Name属性(仅文件名,不含路径),所以拼接后就生成了目标路径c:\destdir\1.txt。
你可以用以下命令验证这个行为:
# 查看FileInfo对象ToString()的输出 gci | ForEach-Object { $_.ToString() } # 查看对象的完整路径属性 gci | ForEach-Object { $_.FullName }
如果需要在字符串拼接里用完整路径,只需明确调用$_.FullName即可,比如:
gci | ForEach-Object { New-Item -ItemType HardLink -Path "c:\destdir\$($_.FullName)" -Value $_ }
不过你的场景里只需要文件名,所以自动转换刚好满足需求。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

