我已安装 Visual Studio Code 并启用了 PowerShell 扩展
我想编写一个包含一些自定义模块(如xHyper-V
和)的所需状态配置xPSDesiredStateConfiguration
。
现在的问题是,PSDesiredStateConfiguration
当我想通过 导入它们时,Visual Studio Code 只能找到默认资源 DSC 资源。Visual Import-DSCResource
Studio Code 无法加载任何其他已安装的 DSC 资源。在 PowerShell ISE 中,一切正常,如您所见(左边是 VSCode,右边是 ISE):
但奇怪的是,这只会影响编辑器本身。在 vscode 的终端中,它会在所有模块中找到 DSC 资源。看这个例子:
PS Z:\Powershell-Scripts\DesiredStateConfiguration> Get-DscResource xVHD
ImplementedAs Name ModuleName Version Properties
------------- ---- ---------- ------- ----------
PowerShell xVHD xHyper-V 3.17.0.0 {Name, Path, DependsOn, Ensure...}
PS Z:\Powershell-Scripts\DesiredStateConfiguration> Get-DscResource WindowsFeature
ImplementedAs Name ModuleName Version Properties
------------- ---- ---------- ------- ----------
PowerShell WindowsFeature PSDesiredStateConfiguration 1.1 {Name, Credential, DependsOn, Ensure...}
它还可以找到模块本身:
PS Z:\Powershell-Scripts\DesiredStateConfiguration> Get-Module xHyper-V, PSDesiredStateConfiguration -ListAvailable
Verzeichnis: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.17.0.0 xHyper-V
Verzeichnis: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.1 PSDesiredStateConfiguration {Set-DscLocalConfigurationManager...}
唯一的区别是它们位于不同的位置,但是当我将模块复制到所在的路径$env:PSModulePath
时它仍然不起作用。xHyper-V
PSDesiredStateConfiguration
有趣的是,这似乎只影响编辑器的 IntelliSense。如果我使用自定义 DSC 模块运行配置,它仍然可以*.mof
正确创建文件。
我怎样才能解决这个问题?
我尝试修复此问题的方法:
- 删除并重新安装所有自定义 DSC 模块
- 在 VSCode 中卸载 PowerShell 扩展,重新启动 VSCode 并再次安装
- 完全重新安装 VSCode
答案1
捂脸。有点尴尬,但在我发布这篇文章一分钟后,我找到了答案:
我也PowerShell Core
安装了。在后台的 VSCode 终端中打开了一个核心会话,它不是活动的,但它不知何故仍然影响了 Intellisense。
只需关闭Core
终端,一切都会按预期工作。
或者
使用 检查提升的权限PowerShell Core
是否$env:PSModulePath
包含 DSC 模块所在的文件夹$env:PSModulePath -split ';'
。该文件夹很可能不在那里。使用以下命令添加它,然后在 vscode 重新启动和 pwsh 重新启动后,IntelliSense 将始终有效,因为 pwsh 现在也会在正确的目录中查找:
$CurrentValue = [Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
[Environment]::SetEnvironmentVariable("PSModulePath", $CurrentValue + [System.IO.Path]::PathSeparator + "C:\Program Files\WindowsPowerShell\Modules", "Machine")