我有一个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,则再次运行它会起作用(此后第二次失败...)。
答案 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>