Power Shell第二次运行脚本后无法覆盖恒定错误吗?

时间:2018-12-14 22:41:19

标签: visual-studio powershell memory constants

我有一个PowerShell脚本,脚本中定义了常量:

Set-Variable MY_CONST -option Constant -value 123

Write-Host "Hello, World!"
Write-Host $MY_CONST

现在,当我运行一次此脚本时,就可以了。 当我再次运行脚本时,您会收到错误消息:

Set-Variable : Cannot overwrite variable MY_CONST because it is read-only or constant.

我正在Visual Studio Code 2017中运行。 如果我退出并重新打开Visual Studio Code,则再次运行它会起作用(此后第二次失败...)。

1 个答案:

答案 0 :(得分:1)

如果使用-Option Constant,则表示告诉PowerShell结果变量不允许以后修改

因此,使用相同的变量名再次运行Set-Variable会导致错误。

也就是说,只有当脚本是“点源”(即直接在调用者的作用域中执行)时,您才会看到该症状,这意味着重复调用会看到先前调用留下的定义

某些环境隐式执行“点源”-特别是PowerShell ISE和带有PowerShell扩展名的Visual Studio Code 。 >

一种简单的解决方法是将-ErrorAction Ignore添加到您的Set-Variable调用中,因为可以公平地假设唯一可能的失败原因是常量的 redefinition

>
  • 通常,在诸如 PowerShell ISE Visual Studio Code 的环境中,请注意,给定脚本的调用可能会留下定义,从而影响后续的调用

  • 相反,从PowerShell 控制台/终端窗口反复调用脚本时,这不是 的问题,因为那里的脚本在中运行子范围。


mhhollomon询问是否使用像$script:...这样的 scope修饰符

否,因为在Visual Studio Code中执行脚本的 global 范围内,范围$script:...Set-Variable -Scope Script ...)是 same 范围,也就是全球范围。

如果确实要明确确保脚本即使在“点源”时也不会修改调用范围,则可以将整个脚本的内容包装在& { ... }中,以确保在子范围内执行。 / p>