24

我将以下代码作为较长脚本的开头:

$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 如何处理运行选择而不是完整脚本,我是否遗漏了什么?运行选择时它不会建立文件系统上下文吗?

4

2 回答 2

29

$MyInvocation是在脚本运行时填充的自动变量,然后如果您在 a中执行或未填充;$MyInvocation.MyCommand.Pathpowershell consoleISE

这就是为什么在你的测试$ScriptPath中没有价值($null

于 2013-09-11T13:23:41.223 回答
0

如果发生在我身上的事情是为什么有些人在 $MyInvocation.MyCommand.Path 中寻找 null,我不知道,但我将解释我是如何找到解决方案的。

我有在生产中工作的脚本,但是当我加载 .ps1 文件并尝试获取 $MyInvocation.MyCommand.Path 时,它为空。我的 Powershell 版本是 4.0,但 ISE 是 1.0 (%windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe)。

但起初我并没有想到为什么它们应该工作,但是当我在 PowerShell 中手动检查 $MyInvocation.MyCommand.Path 或 $MyInvocation 时为什么它为空,以及为什么我收到 Split-Path -parent 的空错误$MyInvocation.MyCommand.Path。

所以我想我需要在我的 Windows 2012 R2 服务器上将 powershell 升级到 5.1,就像在我的桌面 NUC PC 上一样。

真正的问题是我发现如果我在我的 .ps1 文件中设置一个断点并将其运行到我正在执行的位置:

$ScriptDir = 拆分路径-parent $MyInvocation.MyCommand.Path

它奏效了。当然它有效,我已经使用了一段时间。为什么我以前没看到?

什么地方出了错?我试图使用 run step 命令手动运行 PowerShell,但自从 PowerShell 打开以来,我之前从未运行过脚本!

我不得不说这可能是一个 No Duh 时刻。

但是我们最近发生了服务器崩溃,并对其进行了恢复(VSphere Clustered)并重新播种,所以我想也许我有一个旧版本的 PowerShell。

PowerShell 允许您在其中打开多个文件/窗口,但变量在它们之间共享。显然,直到您实际尝试运行脚本(而不是逐步运行),它没有执行脚本文件并且无法为您提供路径。

我希望这篇文章可以避免像我一样浪费大量时间!

于 2018-08-08T17:55:26.433 回答