visual-studio - 第二次运行脚本后,Powershell 无法覆盖持续错误?

标签 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,再次运行它就会起作用(此后第二次会失败......)。

最佳答案

如果您使用-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/

相关文章:

powershell - 将 XLSX 转换为 CSV(另存为)更改日期格式

windows - 等效于 Windows Shell 脚本中的 "script"命令?

iphone如何在频繁加载图片时管理内存

java - 这是内存泄漏还是我刚刚达到了内存中可以保留的对象的限制?

c++ - 如何在 Linux(和 OSX)上查询分配的内存量?

.net - 如何在Visual Studio网站项目类型中添加引用?

java - 如何在 Visual Studio 2017 中使用 Java

.net - 在 Visual Studio 2019 中将警告视为构建错误,而不是智能感知

windows - Powershell脚本自动输入端口号

c++ - 在 Visual Studio 中对齐代码/代码边距