El contenido de la respuesta no se puede analizar porque el motor de Internet Explorer no está disponible o

108

Necesito descargar una serie del canal 9 usando powershell, sin embargo, los scripts que he probado tienen errores:

  1. Este guion

    $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 
      } 
    }
    

    falló con error:

    El contenido de la respuesta no se puede analizar porque el motor de Internet Explorer no está disponible o la configuración del primer inicio de Internet Explorer no está completa. Especifique el parámetro UseBasicParsing y vuelva a intentarlo.

  2. También probé este

    # --- 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
    

    con demasiados errores

    http://screencast.com/t/bgGd0s98Uc

Luis Valencia
fuente
2
La respuesta a su problema está EN el mensaje de error (use el parámetro UseBasicParsing)
bluuf
40
Para ser justos, es fácil ver las palabras "Internet Explorer" en un mensaje de error e ignorar el resto del mensaje mientras se enfurece a ciegas sobre por qué una utilidad de línea de comandos depende de IE.
MisterZimbu

Respuestas:

219

En su solicitud web de invocación, simplemente use el parámetro -UseBasicParsing

por ejemplo, en su script (línea 2) debe usar:

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

Según la documentación , este parámetro es necesario en sistemas donde IE no está instalado o configurado:

Utiliza el objeto de respuesta para contenido HTML sin análisis del modelo de objetos de documento (DOM). Este parámetro es necesario cuando Internet Explorer no está instalado en los equipos, como en una instalación Server Core de un sistema operativo Windows Server.

Franco Pettigrosso
fuente
17
Para futuros visitantes interesados ​​en lo que UseBasicParsingestá haciendo: 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.copia de aquí: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri
39

Para que funcione sin modificar sus scripts:

Encontré una solución aquí: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

El error probablemente se deba a que IE aún no se ha lanzado por primera vez, lo que abre la ventana siguiente. Ejecútelo y pase por esa pantalla, y luego el mensaje de error no volverá a aparecer. No es necesario modificar ningún script.

es decir, primera ventana de lanzamiento

Matt Hyde
fuente
Me funcionó sin tener que actualizar todos los scripts de un servidor Server 2008 a Server 2012 R2 para que un montón de procesos automatizados usaran PowerShell. Esto usó una cuenta específica, así que tuve que ejecutar esto con esa cuenta conectada al servidor.
Bitcoin Murderous Maniac
11
Si bien esto elimina el error, la necesidad de resolver el problema a través de una GUI no es una respuesta aceptable, dado que PowerShell está destinado a usarse como una plataforma de automatización. Esta respuesta no funcionará para todos los escenarios, por ejemplo, dentro de una sesión de comunicación remota de PowerShell.
Devon Dieffenbach
2
Utilice un Objeto de directiva de grupo (GPO) para manejar el primer asistente de ejecución : Configuración del equipo> Directivas> Plantillas administrativas> Componentes de Windows> Internet Explorer. Establezca la política "Evitar la ejecución del asistente de primera ejecución" "en Habilitado y elija la opción que más le convenga.
techie007
Estaba teniendo este problema en kubectly proxy y esto se solucionó cuando uso curl. ¡Gracias!
gpbaculio
Este escenario tampoco funcionará si tiene su aplicación dentro de algún tipo de grupo de escalado automático, ya que la nueva instancia que se está iniciando requerirá esto diario / semanal / etc. Es mejor usar -UseBasicParsing
Ryan C
10

Es seguro porque el comando Invoke-WebRequest tiene una dependencia en los ensamblados de Internet Explorer y lo está invocando para analizar el resultado según el comportamiento predeterminado. Como sugiere Matt, simplemente puede iniciar IE y hacer su selección en el indicador de configuración que aparece en el primer inicio. Y el error que experimente desaparecerá.

Pero esto solo es posible si ejecuta sus scripts de PowerShell como el mismo usuario de Windows con el que inició el IE. La configuración de IE se almacena en su perfil de Windows actual. Entonces, si usted, como yo, ejecuta su tarea en un programador en un servidor como usuario del SISTEMA, esto no funcionará.

Entonces aquí tendrá que cambiar sus scripts y agregar el argumento -UseBasicParsing, como en este ejemplo: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

Peter Stjernholm Meldgaard
fuente
7

Puede deshabilitar la necesidad de ejecutar la primera configuración de inicio de Internet Explorer ejecutando este script de PowerShell, ajustará la propiedad de registro correspondiente:

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

Después de esto, WebClient funcionará sin problemas.

ujeenator
fuente
Desafortunadamente, esto funciona bien solo en versiones de GUI pero no en Windows Server Core.
Lucas
1
@ Luke bien, intentaré descubrir una solución para Windows Server Core
ujeenator
1

También he tenido este problema, y ​​aunque -UseBasicParsing funcionará para algunos, si realmente necesita interactuar con el dom, no funcionará. Intente usar una política de grupo para evitar que aparezca la ventana de configuración inicial y PowerShell ya no lo detendrá. Consulte aquí https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Me tomó solo unos minutos una vez que encontré esta página, una vez que el GP esté configurado, powershell le permitirá pasar.

eragon2262
fuente
1

En su solicitud web de invocación, simplemente use el parámetro -UseBasicParsing

por ejemplo, en su script (línea 2) debe usar:

$rss = Invoke-WebRequest -UseBasicParsing

Según la documentación, este parámetro es necesario en sistemas donde IE no está instalado o configurado.

Utiliza el objeto de respuesta para contenido HTML sin análisis del modelo de objetos de documento (DOM). Este parámetro es necesario cuando Internet Explorer no está instalado en los equipos, como en una instalación Server Core de un sistema operativo Windows Server.

Vinay
fuente
0

Otro método más para resolver: actualizar el registro. En mi caso no pude alterar GPO, y -UseBasicParsing rompe partes del acceso al sitio web. También tenía un usuario de servicio sin permisos de inicio de sesión, por lo que no pude iniciar sesión como usuario y ejecutar la GUI.
Arreglar,

  1. inicie sesión como usuario normal, ejecute la instalación de IE.
  2. Luego exporte esta clave de registro: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. En el archivo .reg que se guarda, reemplace el sid del usuario con el sid de la cuenta de servicio
  4. Importar el archivo .reg

En el archivo

Rayzinnz
fuente