Powershell在VS Code终端中的行为与普通终端不同

时间:2019-01-09 20:44:08

标签: powershell visual-studio-code

我有一个脚本可以像这样从Web API中提取数据:

$wc = New-Object System.Net.WebClient
$response = $wc.DownloadString("https://example.com")

$parser = New-Object Web.Script.Serialization.JavaScriptSerializer
$thing = $parser.DeserializeObject($response)

我使用VS Code作为IDE编写它,并且使用PowerShell插件的集成控制台来测试脚本。当我在那跑的时候,一切都很好。当我尝试使用Windows Powershell程序(从开始菜单以admin启动)运行脚本(在同一台计算机上)时,出现以下错误:

PS C:\repo> .\script.ps1

New-Object : Cannot find type [Web.Script.Serialization.JavaScriptSerializer]: make sure the assembly containing thi
type is loaded.
At C:\repo\script.ps1:15 char:11
+ $parser = New-Object Web.Script.Serialization.JavaScriptSerializer
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

是否存在无法从普通Powershell终端解决此依赖性的原因? VS Code是否设置了我不知道的其他环境?

我正在使用Powershell V3.0,并且在计算机上安装了.NET V4.0。

编辑

$PSVersionTable的输出在两种环境下都是相同的:

Name                           Value
----                           -----
PSVersion                      3.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.2.9200.16398
PSCompatibleVersions           {1.0, 2.0, 3.0}
PSRemotingProtocolVersion      2.2

EDIT2

在脚本顶部添加Add-Type -AssemblyName System.Web.Extensions似乎可以使其从普通终端运行。但是,我仍然想知道为什么在VS Code中没有它就可以运行。加载插件时是否有运行初始化脚本?

1 个答案:

答案 0 :(得分:1)

PowerShell特殊进程提供的“ PowerShell集成控制台”终端,该终端还用于承载PowerShell语言服务器并为VS Code提供编辑器服务。要完成托管语言服务器的工作,它可以加载其他程序集,默认情况下不会加载这些程序集。

要检查过程中已经加载了哪些程序集,可以使用以下命令:

[AppDomain]::CurrentDomain.GetAssemblies() | % FullName
  

加载插件时是否有运行初始化脚本?

是的。否则它将如何知道需要启动语言服务器?检查PowerShell实例如何启动的简单方法是使用:

[Environment]::CommandLine

命令。