我有一个 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,再次运行它就会起作用(此后第二次会失败......)。
最佳答案
如果您使用-Option Constant
,则您是在告诉 PowerShell 生成的变量不应允许稍后修改。
因此,使用相同的变量名称再次运行 Set-Variable
会导致错误。
也就是说,如果您的脚本是“点源”的,即直接在调用者的作用域中执行,您只会看到该症状,这意味着重复调用会看到先前调用留下的定义.
某些环境隐式执行“点采购” - 特别是 PowerShell ISE 和 - 正如您的情况 - 使用 PowerShell 扩展的 Visual Studio Code。
一个简单的解决方法是将 -ErrorAction Ignore
添加到您的 Set-Variable
调用中,因为可以公平地假设唯一可能的失败原因是重新定义 的常数。
更一般而言,在 PowerShell ISE 和 Visual Studio Code 等环境中,请注意给定脚本的调用可能会留下影响后续调用的定义.
相比之下,从 PowerShell 控制台/终端窗口重复调用脚本时,这不是问题,因为那里的脚本在 子范围。
mhhollomon询问使用范围修饰符(例如$script:...
)是否有效:
否,因为在 Visual Studio Code 中执行脚本的全局作用域中,作用域 $script:...
(Set-Variable -Scope Script ...
)是相同范围,即全局范围。
如果您确实想明确确保您的脚本即使在“点源”时也不会修改调用范围,您可以将整个脚本的内容包装在 & { ... }
中确保在子作用域中执行。
关于visual-studio - 第二次运行脚本后,Powershell 无法覆盖持续错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787803/