无法解析回应内容,因为 Internet Explorer 引擎不可用,或

我需要下载一个通道9系列使用 Powershell,然而,我尝试的脚本有错误:

  1. 这个剧本

    $url="https://channel9.msdn.com/blogs/OfficeDevPnP/feed/mp4high"
    $rss=invoke-webrequest -uri $url
    $destination="D:\Videos\OfficePnP"
    [xml]$rss.Content|foreach{
    $_.SelectNodes("rss/channel/item/enclosure")
    }|foreach{
    "Checking $($_.url.split("/")[-1]), we will skip it if it already exists in $($destination)"
    if(!(test-path ($destination + $_.url.split("/")[-1]))){
    "Downloading: " + $_.url
    start-bitstransfer $_.url $destination
    }
    }
    

    因错误而失败:

    由于 Internet Explorer 引擎不可用,或者 Internet Explorer 的首次启动配置不完整,因此无法解析响应内容。指定 UseBasicParsing 参数并重试。

  2. 我也试过这个

    # --- settings ---
    $feedUrl = "https://channel9.msdn.com/blogs/OfficeDevPnP/feed/mp4high"
    $mediaType = "mp4high"
    $overwrite = $false
    $destinationDirectory = join-path ([Environment]::GetFolderPath("MyDocuments")) "OfficeDevPnP"
    
    
    # --- locals ---
    $webClient = New-Object System.Net.WebClient
    
    
    # --- functions ---
    function PromptForInput ($prompt, $default) {
    $selection = read-host "$prompt`r`n(default: $default)"
    if ($selection) {$selection} else {$default}
    }
    
    
    function DownloadEntries {
    param ([string]$feedUrl)
    $feed = [xml]$webClient.DownloadString($feedUrl)
    
    
    $progress = 0
    $pagepercent = 0
    $entries = $feed.rss.channel.item.Length
    $invalidChars = [System.IO.Path]::GetInvalidFileNameChars()
    $feed.rss.channel.item | foreach {
    $url = New-Object System.Uri($_.enclosure.url)
    $name = $_.title
    $extension = [System.IO.Path]::GetExtension($url.Segments[-1])
    $fileName = $name + $extension
    
    
    $invalidchars | foreach { $filename = $filename.Replace($_, ' ') }
    $saveFileName = join-path $destinationDirectory $fileName
    $tempFilename = $saveFilename + ".tmp"
    $filename
    if ((-not $overwrite) -and (Test-Path -path $saveFileName))
    {
    write-progress -activity "$fileName already downloaded" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
    }
    else
    {
    write-progress -activity "Downloading $fileName" -status "$pagepercent% ($progress / $entries) complete" -percentcomplete $pagepercent
    $webClient.DownloadFile($url, $tempFilename)
    rename-item $tempFilename $saveFileName
    }
    $pagepercent = [Math]::floor((++$progress)/$entries*100)
    }
    }
    
    
    # --- do the actual work ---
    [string]$feedUrl = PromptForInput "Enter feed URL" $feedUrl
    [string]$mediaType = PromptForInput "Enter media type`r`n(options:Wmv,WmvHigh,mp4,mp4high,zune,mp3)" $mediaType
    $feedUrl += $mediaType
    
    
    [string]$destinationDirectory = PromptForInput "Enter destination directory" $destinationDirectory
    
    
    # if dest dir doesn't exist, create it
    if (!(Test-Path -path $destinationDirectory)) { New-Item $destinationDirectory -type directory }
    
    
    DownloadEntries $feedUrl
    

    有太多的错误

    Http://screencast.com/t/bggd0s98uc

190621 次浏览

在您的调用 Web 请求中,只需使用参数 -UseBasicParsing

例如,在你的脚本(第2行)中,你应该使用:

$rss = Invoke-WebRequest -Uri $url -UseBasicParsing

根据 文件,这个参数在 IE 没有安装或配置的系统上是必需的:

使用 HTML 内容的响应对象,而不进行文档对象模型(DOM)分析。如果计算机上没有安装 Internet Explorer,例如 Windows 服务器操作系统的服务器核心安装程序,则此参数是必需的。

让它在不修改脚本的情况下工作:

我在这里找到了一个解决方案: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

这个错误很可能是因为 IE 还没有第一次发布而出现的,这会打开下面的窗口。启动它并通过该屏幕,然后错误消息将不再出现。不需要修改任何脚本。

ie first launch window

这是肯定的,因为 Invoke-WebRequest 命令对 Internet Explorer 程序集有依赖关系,并根据默认行为调用它来解析结果。就像 Matt 建议的那样,你可以简单地启动 IE,然后在第一次启动时弹出的设置提示中进行选择。你所经历的错误将会消失。

但是,只有当您运行您的 Powershell 脚本时,您才能使用与启动 IE 时相同的 windows 用户。IE 设置存储在当前 Windows 配置文件下。因此,如果您像我一样作为 SYSTEM 用户在服务器上的调度程序中运行任务,那么这将不起作用。

因此,这里必须更改脚本并添加-UseBasicParsing 参数,如本例所示: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

你可以通过运行这个 PowerShell 脚本来禁用需要运行 Internet Explorer 的第一个启动配置,它会调整相应的注册表属性:

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Internet Explorer\Main" -Name "DisableFirstRunCustomize" -Value 2

在此之后,WebClient 将工作没有问题

我也遇到过这个问题,虽然-UseBasicParsing 可以为一些人工作,但是如果您实际上需要与 dom 进行交互,它就不会工作。尝试使用组策略来阻止初始配置窗口的出现,Powershell 将不再阻止您。 看这里 Https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

我只花了几分钟,一旦我发现这个页面,一旦 GP 设置,Powershell 将允许您通过。

还有另一种解决方法: 更新注册表。在我的情况下,我不能改变 GPO,并且-UseBasicParsing 破坏了对网站的部分访问。另外,我有一个没有登录权限的服务用户,所以我不能以用户的身份登录并运行 GUI。
为了弥补,

  1. 作为普通用户登录,运行 IE 设置。
  2. 然后导出这个注册表项: HKEY _ users S-1-5-21-... . SOFTWARE Microsoft Internet Explorer
  3. 在保存的.reg 文件中,将用户 sid 替换为服务帐户 sid
  4. 导入.reg 文件

在文件里

在您的调用 Web 请求中,只需使用参数 -UseBasicParsing

例如,在你的脚本(第2行)中,你应该使用:

$rss = Invoke-WebRequest -UseBasicParsing

根据文档,这个参数在没有安装或配置 IE 的系统上是必需的。

使用 HTML 内容的响应对象,而不进行文档对象模型(DOM)分析。如果计算机上没有安装 Internet Explorer,例如 Windows 服务器操作系统的服务器核心安装程序,则此参数是必需的。

在我的例子中,我只需将 curl命令更改为 Invoke-RestMethod,错误就消失了。

在 Windows 10中,当操作系统安装 Edge 之后(IE 根本不用——因为许多用户只是喜欢在安装新的 Windows 之后使用 Chrome) ,尝试从本地主机运行脚本时,使用

curl http://localhost:3000/

收到了相同的错误消息——正如 Luis 提到的,后面跟着这个:



+ curl http://localhost:3000/
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotImplement
ed: (:) [Invoke-WebRequest], NotSuppor
tedException
+ FullyQualifiedErrorId : WebCmdletIED
omNotSupportedException,Microsoft.Powe
rShell.Commands.InvokeWebRequestComman
d


如果你用

Invoke-RestMethod  http://localhost:3000/

代码将按预期工作。

我没有试图复制 Luis 的确切代码,但是它仍然是一个对我有用的用例。

此外,因为这个问题是在5年前提出的,而且选择了最佳答案,所以我决定仍然让我的答案出现在这里,只是为了那些也可以在其他场景中使用它的读者(例如,当在 nodejs 中运行代码并打开第二个终端来更快地测试它,而不是打开一个新的浏览器实例时)

只要打开 Internet Explorer,就会弹出一个设置选项,点击“使用推荐设置”,确定并关闭它。现在没事了。

WindowsServerCore (使用 WindowsServer2022核心测试) :

要求: Windows 服务器语言和可选特性

首先,安装 视窗核心的 FOD并重新启动:

Add-WindowsCapability -Online -Name ServerCore.AppCompatibility~~~~0.0.1.0;


shutdown /r /t 0;

其次,通过安装 Windows 服务器语言和可选特性 ISO 映像来安装 IE 11:

Add-WindowsPackage -Online -PackagePath "D:\LanguagesAndOptionalFeatures\Microsoft-Windows-InternetExplorer-Optional-Package~31bf3856ad364e35~amd64~~.cab";

使用 Get-PSDrive确认驱动器号。

或者

根据 Microsoft 的建议安装 MicrosoftEdge:

Invoke-WebRequest -UseBasicParsing -Uri "https://c2rsetup.officeapps.live.com/c2r/downloadEdge.aspx?platform=Default&source=EdgeStablePage&Channel=Stable&language=en"  -OutFile "MicrosoftEdgeSetup.exe"

禁用阻止 Invoke-WebRequest 在 PS 上工作的第一次启动配置

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Internet Explorer\Main" -Name "DisableFirstRunCustomize" -Value 2

我需要让这个工作,因为我的任务是部署一个 Windows 服务器核心虚拟机与广告域服务的角色,并使用星球大战 PowerShell 模块内部使用调用-WebRequest 没有-UseBasicParsing 当做它的 API/下载在它的脚本为星球大战广告字符。希望这能帮到其他人。