$MyInvocation.MyCommand的.Source与.Path属性何时存在差异?
关于$MyInvocation.MyCommand中Source和Path属性的差异说明
这不是巧合,ExternalScriptInfo(对应脚本文件的命令对象)里的Source和Path属性取值一致是设计逻辑导致的,但在其他类型的命令对象中,二者会有明显区别:
1. 脚本文件(ExternalScriptInfo)场景
脚本的“源”就是它的物理文件路径,所以官方文档里对Source(获取命令的源)和Path(获取脚本文件路径)的描述,本质指向的是同一个内容。实际测试中,无论你直接运行脚本还是通过其他方式调用,这两个属性的输出都是脚本的完整绝对路径。
示例验证:
# 在test.ps1中写入以下代码 Write-Host "Source: $($MyInvocation.MyCommand.Source)" Write-Host "Path: $($MyInvocation.MyCommand.Path)"
运行后输出的两行内容完全一致。
2. 其他命令类型的差异情况
只有脚本文件的命令对象会出现二者一致的情况,其他类型的命令对象中,Source和Path的取值有明显区别:
- 函数(FunctionInfo):
Source会返回函数定义所在的脚本文件路径(如果函数是在脚本里定义的),但Path属性始终为空,因为函数不是独立的文件实体。 - Cmdlet(CmdletInfo):
Source返回包含该Cmdlet的.NET程序集路径,Path属性为空,因为Cmdlet是编译后的代码,没有对应的脚本文件路径。 - 脚本块(ScriptBlockInfo):如果脚本块来自某个脚本文件,
Source会返回该脚本的路径,而Path属性同样为空。
总结
Source和Path在脚本文件场景下的一致性是设计逻辑导致的——脚本的“源”就是它的文件路径;而在非脚本文件的命令类型中,二者的取值会根据命令的本质产生差异,这才是两个属性设计的核心区别。
内容的提问来源于stack exchange,提问作者Hashbrown
相关产品推荐
相关产品推荐

