【问题标题】:PowerShell: Script cannot set a parameterPowerShell:脚本无法设置参数
【发布时间】:2013-10-21 15:09:15
【问题描述】:

对于应该与 powerShell 2 兼容的脚本,我有一个名为 $exeLoc 的参数,声明如下: 参数( [范围()] [别名(“el”)] $exeLoc= '......\sw' )

我尝试在函数中设置该参数,从相对到绝对,如下:

Function FromRelToAbs()
{
   Push-Location $exeLoc
   $Global:exeLoc = (Join-path $PWD -ChildPath '\Vis.exe' )
  Pop-Location
}

但是,调用上述函数后,$exeLoc 的值并没有改变。

以上代码在 powersell v3 和 powershell v2 ISE 上完美运行。它在 powershell v2 窗口(不是 ISE)上无法正常工作

有什么想法吗?

【问题讨论】:

  • 全局范围听起来很可疑。参数是其函数的局部变量;如果您从带有声明参数的函数调用该函数,您的意思是不是 $parent:exeLoc
  • 这是脚本参数,不是函数参数;即这是在脚本开头声明的,我的意思是让它们用作全局变量。我弄错了吗?
  • 在这种情况下,我认为script 范围会更合适。但老实说,我没有太多使用各种范围的经验。

标签: powershell-2.0


【解决方案1】:

我认为你的脚本是这样的:

param($x = 2)

write-output "[script] Value of x is 2"

function blah {
  $global:x = 5
  write-output "[blah] Setting x as 5"
}

Write-Output "Calling function blah"
blah
Write-Output "[script] Value of x is $x"

您在脚本中设置变量;脚本中有一个函数,它引用全局范围内的变量并设置其值。

如果我在我的机器 (PowerShell v2) 上尝试上述操作,它会正确设置变量。也许我理解错了你的脚本?

【讨论】:

  • 这基本上就是我想要做的。唯一的区别是我有一个函数可以在“blah”之前和之后打印 $x 值。在我的机器 ps v2 上,这只适用于 ISE。在 shell 中,它不会设置 $x...
  • 我意识到为什么它对我有用,但对你没有用。我正在点源脚本(习惯!),而您只是在运行它。当点源脚本时,只有一个全局范围,但是当正常运行脚本时,有一个全局范围和一个脚本范围。因此,当您设置 $global:var 时,您实际上更改了全局范围内的变量,而不是脚本范围内的变量。将 $global: 更改为 $script: 在您的代码中,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多