因此,我有一个个人项目正在处理,我想在其中将$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。有人知道为什么会这样吗?任何建议都非常感谢!
答案 0 :(得分:2)
$MyInvocation
不提供有关当前脚本的信息。它告诉您谁调用了脚本。根据{{3}}:
与$ PSScriptRoot和$ PSCommandPath自动变量不同, $ MyInvocation的PSScriptRoot和PSCommandPath属性 自动变量包含有关调用者或调用的信息 脚本,而不是当前脚本。
因此,您要使用的是$PSCommandPath
,如下所示:
$global:Name = [IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
function test {
$Name
}
test