我创建了一个带有一段代码的函数,该代码在脚本中运行良好但在转换为函数时失败。
代码将脚本所在的位置设置为当前位置。
Function Set-ScriptFolder
{
<#
.SYNOPSIS
Sets the location to the folder where the script folder resides.
.DESCRIPTION
Sets the location to the folder where the script folder resides.
.EXAMPLE
Set-ScriptFolder
.EXAMPLE
Set-ScriptFolder
#>
$location = Split-Path $MyInvocation.MyCommand.Path
set-location $location
}
输出结果为:
Split-Path : Cannot bind argument to parameter 'Path' because it is null.
set-location : Cannot process argument because the value of argument "path" is null. Change the value of argument
"path" to a non-null value.
任何想法如何转换:
$location = Split-Path $MyInvocation.MyCommand.Path
set-location $location
到函数?
由于
答案 0 :(得分:2)
如果你看一下你会看到的documentation for $MyInvocation
......
仅为脚本,函数和脚本块填充
$MyInvocation
。 您可以使用System.Management.Automation.InvocationInfo中的信息 $ MyInvocation在当前脚本中返回的对象,例如路径 和脚本的文件名($MyInvocation.MyCommand.Path
)或者名称 函数($MyInvocation.MyCommand.Name
)来识别当前命令。
您可以看到函数内的$MyInvocation.MyCommand.Name
输出将返回:
Set-ScriptFolder
替代解决方案
您可以使用automatic variable $PSScriptRoot
代替。
Set-Location $PSScriptRoot
这也应该在函数内部起作用。如果您愿意,只要您拥有PowerShell 3.0或更高版本,您也可以使用PSScriptRoot
的{{1}}。
$MyInvocation
只有一行的功能似乎有点矫枉过正。