全局:未在PowerShell中的函数中设置变量

时间:2019-07-17 22:03:57

标签: powershell global

因此,我有一个个人项目正在处理,我想在其中将$Name的值设置为脚本的名称而没有路径或文件扩展名。我以为可以将它作为全局变量来执行,因为它需要调用几次。

我使用过set-variable命令并使用过$global:Name,但是当我在函数中调用变量时,似乎没有任何作用。我还使用了其他变量名称,例如“ foo”,但仍然无法正常工作。以下是一些示例代码片段:

Set-Variable -name Name -value [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName) -scope global
function test {
    $Name
}
test
Pause

我也尝试过:

Set-Variable -name Name -value [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName) -scope global
function test {
    $global:Name
}
test
Pause

并且:

$global:Name = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName)

function test {
    $Name
}
test
Pause

并且:

$global:Name = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName)
function test {
    $global:Name
}
test
Pause

并且:

$script:Name = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName)
function test {
    $script:Name
}
test
Pause

并且:

$script:Name = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.ScriptName)
function test {
    $Name
}
test
Pause

我期望脚本的名称会出现,但是它只会返回null。有人知道为什么会这样吗?任何建议都非常感谢!

1 个答案:

答案 0 :(得分:2)

$MyInvocation不提供有关当前脚本的信息。它告诉您谁调用了脚本。根据{{​​3}}:

  

与$ PSScriptRoot和$ PSCommandPath自动变量不同,   $ MyInvocation的PSScriptRoot和PSCommandPath属性   自动变量包含有关调用者或调用的信息   脚本,而不是当前脚本。

因此,您要使用的是$PSCommandPath,如下所示:

$global:Name = [IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
function test {
    $Name
}
test