由于Internet Explorer引擎不可用,因此无法解析响应内容,或者


107

我需要使用powershell下载Channel 9系列,但是我尝试的脚本有错误:

  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


2
您的问题的答案是在错误消息中(使用UseBasicParsing参数)
bluuf

38
公平地讲,当您对命令行实用程序为何依赖IE盲目时,很容易在错误消息中看到单词“ Internet Explorer”,而忽略其余消息。
MisterZimbu

Answers:


218

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

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

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

根据文档,此参数在未安装或配置IE的系统上是必需的:

将响应对象用于HTML内容,而无需解析文档对象模型(DOM)。当计算机上未安装Internet Explorer时(例如Windows Server操作系统的Server Core安装上),此参数是必需的。


17
对于有兴趣在什么样的未来观众UseBasicParsing是这样做的:Uses the response object for HTML content without Document Object Model (DOM) parsing. This parameter is required when Internet Explorer is not installed on the computers, such as on a Server Core installation of a Windows Server operating system.从这里复制:docs.microsoft.com/de-de/powershell/module/...
布鲁诺BIERI

39

要使其工作而无需修改脚本:

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

该错误可能正在出现,因为尚未首次启动IE,并显示了下面的窗口。启动它并通过该屏幕,然后错误消息将不再出现。无需修改任何脚本。

即第一个启动窗口


为我工作,而无需将一堆从Server 2008服务器更新到Server 2012 R2的所有脚本,即可使用一堆自动化流程来使用PowerShell。这使用了一个特定的帐户,因此我确实必须通过将该帐户登录到服务器来完成此过程。
比特币惨案狂人

11
尽管这确实消除了错误,但是考虑到PowerShell打算用作自动化平台,因此通过GUI解决问题的需求不是可接受的答案。此答案不适用于所有场景,例如,在PowerShell Remoting Session中。
德文·迪芬巴赫

2
使用组策略对象(GPO)处理首次运行向导:“计算机配置”>“策略”>“管理模板”>“ Windows组件”>“ Internet Explorer”。将“阻止运行首次运行向导”策略设置为“已启用”,然后选择一个适合您的选项
。– techie007

我在kubectly代理上遇到了这个问题,并且在使用curl时已解决。谢谢!
gpbaculio

如果您的应用程序位于某种类型的自动伸缩组中,则这种情况也将不起作用,因为要启动的新实例每天/每周/等等都需要这样做。最好使用-UseBasicParsing
Ryan C

10

可以肯定的是,因为Invoke-WebRequest命令依赖于Internet Explorer程序集,并且正在根据默认行为调用它来解析结果。正如Matt所建议的那样,您只需启动IE并在首次启动时弹出的设置提示中进行选择。而且您遇到的错误将消失。

但这只有在以与启动IE相同的Windows用户身份运行Powershell脚本的情况下才有可能。IE设置存储在您当前的Windows配置文件下。因此,如果您像我一样以SYSTEM用户身份在服务器上的调度程序中运行任务,则此操作将无效。

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


7

您可以通过运行以下PowerShell脚本来禁用需要运行Internet Explorer的首次启动配置,它将调整相应的注册表属性:

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

此后,WebClient将正常工作


不幸的是,这仅适用于GUI版本,而不适用于Windows Server Core。
路加福音

1
@Luke好的,我将尝试发现Windows Server Core的解决方案
ujeenator

1

我也遇到过这个问题,虽然-UseBasicParsing对于某些人有用,但是如果您实际上需要与它交互的dom进行交互,则不会。尝试使用一个组策略来阻止初始配置窗口的出现,而powershell不会再阻止您。参见此处 https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

找到该页面后,我花了几分钟,设置好GP后,powershell即可帮助您完成操作。


1

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

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

$rss = Invoke-WebRequest -UseBasicParsing

根据文档,此参数在未安装或配置IE的系统上是必需的。

将响应对象用于HTML内容,而无需解析文档对象模型(DOM)。当计算机上未安装Internet Explorer时(例如Windows Server操作系统的Server Core安装上),此参数是必需的。


0

解决的另一种方法是:更新注册表。就我而言,我无法更改GPO,并且-UseBasicParsing会中断对网站的访问。另外,我有一个没有登录权限的服务用户,因此无法以该用户身份登录并运行GUI。
修理,

  1. 以普通用户身份登录,运行IE安装程序。
  2. 然后导出此注册表项:HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. 在保存的.reg文件中,将用户sid替换为服务帐户sid
  4. 导入.reg文件

在文件中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.