Powershell 不加载 System.Net.Http 程序集并忽略脚本中的 Add-Type

0xC*_*DCD 8 powershell powershell-5.0

我正在尝试使用HttpClient自定义HttpClientHandler(以修复未通过重定向正确管理的 Cookie 问题)。

\n\n

两者都位于System.Net.Http程序集(和命名空间)中,并且 Powershell(和 ISE)大多数时候看不到类(也看不到命名空间)。

\n\n

它确实找到了一个类System.Net.Http(实际上它是WebRequestMethods.Http),我不会对它破坏一切感到惊讶。

\n\n

所以我创建了这个 KISS 示例:

\n\n
using namespace System.Net.Http\n\nclass Wtf : HttpClientHandler {\n}\n\n$t = [HttpClient]::new()\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我运行它,它会告诉我该类型不存在。(如果我使用完整的命名空间而不是 ,它也会这样做using)。

\n\n

然而有趣的是接下来发生的事情。\n如果我在 ISE 中使用相同的代码,IDE 只会告诉我HttpClient找不到基类。(没有关于实例化的内容)

\n\n

我发现这Add-Type可以帮助我,所以我添加

\n\n
Add-Type -AssemblyName System.Net.Http\n\nWrite-Host "Hello World"\n
Run Code Online (Sandbox Code Playgroud)\n\n

之间using namespace System.Net.Httpclass Wtf : HttpClientHandler {

\n\n

尝试运行它时我仍然遇到相同的错误 - 但我根本看不到我的"Hello World"!\n因此解析它时似乎失败了,并且它甚至没有尝试运行它。\nISE 仍然显示相同的内容IDE 中的错误。

\n\n

然后,如果我Add-Type -AssemblyName System.Net.Http在再次运行脚本之前运行(无论是从 PowerShell 提示符还是 ISE),一切都会正常运行。\n此外,从那时起,ISE IDE 智能感知可以列出命名空间内的所有内容System.Net.Http

\n\n

那么用户如何才能只启动我的 PowerShell 脚本,而不必同时运行Add-Type我的脚本呢?

\n\n

我在 Win10 上使用 PS 5.1,虽然我有 C# 背景,但我还是 PowerShell 环境的新手。

\n\n

EDIT1:使用 HttpClientHandler 而不是 HttpClient (但无论问题是相同的)

\n\n

编辑2:\n这是我现在正在使用的

\n\n
using assembly System.Net.Http\nusing namespace System.Net.Http\n\nclass Test : HttpClient {\n}\n\n[HttpClient]::new()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是输出:

\n\n
Au caract\xc3\xa8re C:\\Users\\0xdcdcdcd\\Desktop\\Test.ps1:4 : 14\n+ class Test : HttpClient {\n+              ~~~~~~~~~~\nType [HttpClient] introuvable.\n    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException\n    + FullyQualifiedErrorId : TypeNotFound\n
Run Code Online (Sandbox Code Playgroud)\n

js2*_*010 9

# test.ps1
Add-Type -AssemblyName System.Net.Http

class Test : system.Net.Http.HttpClient {
}


At C:\users\admin\test.ps1:3 char:14
+ class Test : system.Net.Http.HttpClient {
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [system.Net.Http.HttpClient].
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : TypeNotFound

Run Code Online (Sandbox Code Playgroud)

我现在知道了。太疯狂了,它在脚本中不起作用。我相信这里提供了一些解决方案: Powershell:使用 PS 5 类时无法找到类型

编辑:实际上,这在 PS 6 中适用于我。如果您使用的是 Windows 10 1809,则许多命令在 PS 6 中再次有效。


Fox*_*loy 5

那么用户如何才能只启动我的 PowerShell 脚本而不必同时运行 Add-Type 和我的脚本呢?

高级 PowerShell 脚本以一些 using 语句开头是很常见的,因此您可以像这样开始脚本:

using assembly System.Net.Http
using namespace System.Net.Http
#your code here
Run Code Online (Sandbox Code Playgroud)

但大多数时候,在现代 PowerShell 中,尤其是对于 Web 命令,您可以而且应该从使用 PowerShell cmdlet 开始。

那么我问你的问题是你想用 HttpClient 做什么?让我知道您想做什么,我很乐意向您展示“PowerShell”方式来实现它:)