我有以下代码作为一个较长脚本的开头:
$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处理选择而不是完整脚本的方式,我是否遗漏了什么?当您运行选择时,它不会建立文件系统上下文吗?
发布于 2013-09-11 21:23:41
$MyInvocation
是在脚本运行时填充的automatic variable ,如果您在powershell console
中执行$MyInvocation.MyCommand.Path
或不填充ISE
;
这就是为什么在测试中$ScriptPath
没有值($null
)的原因
发布于 2018-08-09 01:55:26
我不知道发生在我身上的事情是不是有些地方在$MyInvocation.MyCommand.Path中寻找null,但我会解释我是如何找到解决方案的。
我有一些可以在生产环境中运行的脚本,但是当我加载.ps1文件并尝试获取$MyInvocation.MyCommand.Path时,它是空的。我的Powershell版本是4.0,但是ISE (%windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe).的版本是1.0
但是我一开始并没有想到为什么它们应该工作,然而当我在PowerShell中手动检查$MyInvocation.MyCommand.Path或$MyInvocation时,为什么它是null,为什么我得到了拆分路径-parent $MyInvocation.MyCommand.Path的null错误。
所以我想我需要在我的Windows2012NUC服务器上将powershell升级到5.1,就像在我的桌面R2 PC上一样。
真正的问题是,我发现如果我在.ps1文件中设置了一个断点,并将其运行到我正在做的地方:
$ScriptDir =拆分路径-parent $MyInvocation.MyCommand.Path
它起作用了。它当然有效,我已经用了一段时间了。为什么我之前没看到呢?
哪里出了问题?我试图使用run step命令手动运行PowerShell,因为PowerShell是打开的,所以我以前从未运行过该脚本!
我不得不说这可能是一个不好的时刻。
但是我们最近遇到了一次服务器崩溃,并将其恢复(VSphere集群)并重新播种,所以我想也许我有一个旧版本的PowerShell。
PowerShell允许您在其中打开多个文件/窗口,但变量是在它们之间共享的。显然,直到您实际尝试运行脚本(而不是逐步运行)时,它才会执行脚本文件,并且无法获取路径。
我希望这篇文章能避免有人像我一样浪费时间!
https://stackoverflow.com/questions/18742354
复制相似问题