如何在PowerShell中禁用Internet Explorer解析

cgvd09ve  于 2023-03-23  发布在  Shell
关注(0)|答案(1)|浏览(193)

如果Internet Explorer不可用,Invoke-WebRequest cmdlet可能会失败 *:

The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.

如果我在一台运行Internet Explorer的计算机上,则不需要-UseBasicParsing。我想测试我的脚本是否可以在未运行IE或已卸载IE的计算机上运行。在我的测试环境中,如何故意创建会发生上述错误的条件?

  • PowerShell 6.0.0之前。
e5nszbig

e5nszbig1#

如果我使用的计算机上有正常运行的Internet Explorer,则不需要-UseBasicParsing
即使它不是 * 必需的 * 以避免错误,你也应该使用这个开关,* 除非 * 你真的需要将响应解析成DOM,可以通过.ParsedHTML属性访问。-UseBasicParsing可以防止这种不必要的解析带来的开销。
因此,如果您不需要Internet Explorer中介的DOM解析, 总是 * 使用
-UseBasicParsing很好,甚至可以在 * 跨版本 * 场景中工作
*:
虽然-UseBasicParsingPowerShell (Core)(v6+)中是“永远不需要的”--在这里解析到DOM甚至是“不可用的”--但您仍然可以在那里使用它,而不会产生不良影响。
如果你不想把-UseBasicParsing开关传递给 * 每一个调用 ,你可以通过$PSDefaultParameterValues首选项变量**预置 * -UseBasicParsing * 会话范围 *:

# Note: '*' targets *all* commands that have a -UseBasicParsing parameter
#       While you could 'Invoke-WebRequest' instead of '*',
#       '*' ensures that 'Invoke-RestMethod' is covered too.
$PSDefaultParameterValues['*:UseBasicParsing'] = $true

如果您想将此预设 * 作用于 * 给定脚本*(以及从中调用的脚本/函数),请使用this answer中所示的技术。

我怎样才能故意创造条件,使上述错误发生呢?
如果你想**对你的代码运行测试,模拟 * 错误情况,以确保你所有的代码都使用-UseBasicParsing

  • 安装Pester模块,例如使用Install-Module -Scope CurrentUser Pester。Pester是PowerShell广泛使用的测试框架。
  • 使用Pester的 mocking 功能来模拟一个错误,只要Invoke-WebRequestInvoke-RestMethod调用 * 没有 * -UseBasicParsing

下面是一个 * 简单 * 的例子(保存到EnforceBasicParsing.Tests.ps1,然后用.\EnforceBasicParsing.Tests.ps1调用):

Describe 'Enforce -UseBasicParsing' {
  BeforeAll {
    # Set up mocks for Invoke-WebRequest and Invoke-RestMethod
    # that throw whenever -UseBasicParsing isn't passed.
    $exceptionMessageAndErrorId = "Missing -UseBasicParsing"
    'Invoke-WebRequest', 'Invoke-RestMethod' | ForEach-Object {
      Mock -CommandName $_  `
           -ParameterFilter { -not $UseBasicParsing } `
           -MockWith{ throw $exceptionMessageAndErrorId } 
    }
  }
  It 'Fails if -UseBasicParsing is NOT used with Invoke-WebRequest' {
    { Invoke-WebRequest http://example.org } |
      Should -Throw -ErrorId $exceptionMessageAndErrorId
  }
  It 'Fails if -UseBasicParsing is NOT used with Invoke-RestMethod' {
    { Invoke-RestMethod http://example.org } |
      Should -Throw -ErrorId $exceptionMessageAndErrorId
  }
  It 'Deliberately failing test' {
    { Invoke-RestMethod http://example.org } |
      Should -Not -Throw -ErrorId $exceptionMessageAndErrorId
  }
}

前两个测试成功了,而第三个测试被故意设置为失败,这显示了如果测试在不使用-UseBasicParsing的真实的代码上运行会发生什么。
参见:Pester documentation

相关问题