Powershell ведет себя иначе в терминале VS Code, чем в обычном терминале - PullRequest
0 голосов
/ 09 января 2019

У меня есть скрипт, который извлекает данные из веб-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 (запускается как администратор из меню «Пуск»), я получаю следующую ошибку:

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.

EDIT

Вывод $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 голосов
/ 12 января 2019

Терминал «PowerShell Integrated Console», предоставляемый специальным процессом PowerShell, который также используется для размещения языкового сервера PowerShell и предоставления услуг редактирования для VS Code. Чтобы выполнить работу хостинга языкового сервера, он может загружать дополнительные сборки, которые не загружаются по умолчанию.

Чтобы проверить, какие сборки уже загружены в процессе, вы можете использовать следующую команду:

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

Есть ли скрипт инициализации, который запускается при загрузке плагина?

Да, это так. Как иначе он знал бы, что для этого нужно запустить языковой сервер? Простой способ проверить, как был запущен экземпляр PowerShell, - использовать:

[Environment]::CommandLine

команда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...