我编写了以下代码以获取一些(相对的)文件路径:
function Get-ExecutingScriptDirectory() {
return Split-Path $script:MyInvocation.MyCommand.Path # returns this script's directory
}
$some_file_path = Get-ExecutingScriptDirectory | Join-Path -Path $_ -ChildPath "foo.json"
这导致了错误:
Join-Path : Cannot bind argument to parameter 'Path' because it is null.
+ $some_file_path = Get-ExecutingScriptDirectory | Join-Path -Path $_ -ChildPath "fo ...
+ ~~
+ CategoryInfo : InvalidData: (:) [Join-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.JoinPathCommand
这向我表明Get-ExecutingScriptDirectory
输出为null - 但实际上不是 - 当我像这样编写脚本时,它是正常的:
$this_directory = Get-ExecutingScriptDirectory
$some_file_path = Join-Path -Path $this_directory -ChildPath "foo.json"
因此问题在于
$_
是空的。我期望 $_
是对前一个管道输出的引用。MSDN 文档 也是这样建议的,但似乎它自己立即就矛盾了:
在我的代码上下文中,$_ 包含管道对象中的当前对象。您可以在执行针对每个对象或管道中选择的对象执行操作的命令时使用此变量。
$_
似乎符合“管道对象中的当前对象”的条件,但我没有将其与在每个对象上执行操作或在管道中选择的对象一起使用的命令配合使用。看起来
$$
和 $^
很有用,但 MSDN 文档只是在这里关于词法标记说了几句模棱两可的话。$PSItem
的文档同样简洁。实际上我想做的是创建一个大的管道:
$some_file_path = Get-ExecutingScriptDirectory | Join-Path -Path {{PREVIOUS STDOUT}} -ChildPath "foo.json" | Get-Content {{PREVIOUS STDOUT}} | Convert-FromJson {{PREVIOUS STDOUT}} | {{PREVIOUS STDOUT}}.data
我想知道自己在概念和技术层面上哪里出了问题。
Get-ExecutingScriptDirectory
返回一个路径值,那么你可以直接将它传递到Join-Path
中,因为-Path
参数通过管道接受值 -->Get-ExecutingScriptDirectory | Join-Path -ChildPath ...
。这里没有当前的输入对象$_
,因为你没有使用一个带有脚本块的命令来处理它。如果你使用Get-ExecutingScriptDirectory | Foreach-Object { }
,你将在Foreach
脚本块中访问$_
,并且可以创建其他你喜欢的变量。 - AdminOfThingsForEach-Object
似乎有些奇怪,因为之前的函数(Get-ExecutingScriptDirectory
)只输出了一个东西(一个字符串)。我还不清楚它是否在技术上是“字符串类型的对象”。另外,我想将Get-ExecutingScriptDirectory
的整个输出都管道传递到Join-Path
的一个参数中,但我没有看到合适的自动变量。 - alex{ }
中使用$_
。这是非常基础的。文档中说明了哪些参数可以被管道传递,有些只需要按值传递,有些需要按属性名称传递。 - js2010