我将以下代码作为较长脚本的开头:
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path
& $ScriptPath\build_functions.ps1
& $ScriptPath\build_builddefs.ps1
我们的想法是获取正在运行的脚本的路径,并使用该路径调用一些支持脚本。但是,当我单独测试它以确保它可以工作时(通过突出显示该块并运行该代码),我收到以下错误:
Split-Path: Cannot bind argument to parameter 'Path' because it is null.
有趣的是,当我运行整个脚本时,它似乎分别运行这些文件。关于ISE如何处理运行选择而不是完整脚本,我有什么遗漏吗?运行选择时是否不建立文件系统上下文?
答案 0 :(得分:23)
$MyInvocation
是脚本运行时填充的automatic variable ,如果您在$MyInvocation.MyCommand.Path
或powershell console
中执行ISE
没有填充;
这就是为什么在您的测试中$ScriptPath
没有价值($null
)
答案 1 :(得分:0)
我不知道发生什么事是为什么有人在$ MyInvocation.MyCommand.Path中寻求空值,但是我将解释如何找到解决方案。
我有一些正在生产中使用的脚本,但是当我加载.ps1文件并尝试获取$ MyInvocation.MyCommand.Path时,它为null。我的Powershell版本是4.0,但ISE是1.0(%windir%\ system32 \ WindowsPowerShell \ v1.0 \ PowerShell_ISE.exe)。
但是起初我并没有想到它们为什么应该起作用,但是当我在PowerShell中手动检查$ MyInvocation.MyCommand.Path或$ MyInvocation时,为什么它为null,为什么我得到了Split-的null错误?路径-父$ MyInvocation.MyCommand.Path。
所以我想我需要像台式机NUC PC一样,在Windows 2012 R2服务器上将Powershell升级到5.1。
真正的问题是,我发现如果在.ps1文件中设置一个断点并将其运行到我正在执行的位置:
$ ScriptDir =拆分路径-父$ MyInvocation.MyCommand.Path
它奏效了。当然可以,我已经使用了一段时间了。为什么以前没有看到它?
出了什么问题?自从打开PowerShell以来,我从未运行过脚本,我试图使用run step命令来手动运行PowerShell!
我不得不说这可能是一个不准的时刻。
但是我们最近发生了服务器崩溃,并使其还原(VSphere Clustered)并重新播种,所以我想也许我有一个旧版本的PowerShell。
PowerShell允许您在其中打开多个文件/窗口,但变量在它们之间共享。显然,除非您实际尝试运行脚本(而不是逐步运行),否则该脚本将不会执行脚本文件,也无法获取路径。
我希望这篇文章可以避免别人像我一样浪费大量时间!