我有一个脚本可以像这样从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中没有它就可以运行。加载插件时是否有运行初始化脚本?
答案 0 :(得分:1)
PowerShell特殊进程提供的“ PowerShell集成控制台”终端,该终端还用于承载PowerShell语言服务器并为VS Code提供编辑器服务。要完成托管语言服务器的工作,它可以加载其他程序集,默认情况下不会加载这些程序集。
要检查过程中已经加载了哪些程序集,可以使用以下命令:
[AppDomain]::CurrentDomain.GetAssemblies() | % FullName
加载插件时是否有运行初始化脚本?
是的。否则它将如何知道需要启动语言服务器?检查PowerShell实例如何启动的简单方法是使用:
[Environment]::CommandLine
命令。