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

时间:2016-06-24 03:53:47

标签: powershell internet-explorer

我需要使用powershell下载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

8 个答案:

答案 0 :(得分:124)

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

e.g。在您的脚本(第2行)中,您应该使用:

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

答案 1 :(得分:19)

在不修改脚本的情况下使其工作:

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

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

ie first launch window

答案 2 :(得分:8)

可以肯定,因为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

答案 3 :(得分:3)

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

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

此后,WebClient将正常工作

答案 4 :(得分:1)

我也遇到过这个问题,虽然-UseBasicParsing对于某些人有用,但是如果您实际上需要与dom交互,则它将无法工作。尝试使用组策略停止显示初始配置窗口,而powershell不会再阻止您。 看这里 https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

找到该页面后,请花几分钟时间,设置好GP后,powershell将允许您完成操作。

答案 5 :(得分:1)

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

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

$rss = Invoke-WebRequest -UseBasicParsing

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

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

答案 6 :(得分:0)

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

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

在文件

答案 7 :(得分:0)

就我而言,我只需将 curl 命令更改为 Invoke-RestMethod,错误就消失了。