Il contenuto della risposta non può essere analizzato perché il motore di Internet Explorer non è disponibile o


108

Devo scaricare una serie di canali 9 utilizzando PowerShell, tuttavia gli script che ho provato contengono errori:

  1. Questo script

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

    fallito con errore:

    Il contenuto della risposta non può essere analizzato perché il motore di Internet Explorer non è disponibile o la configurazione del primo avvio di Internet Explorer non è completa. Specificare il parametro UseBasicParsing e riprovare.

  2. Ho provato anche questo

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

    http://screencast.com/t/bgGd0s98Uc


2
La risposta al tuo problema è nel messaggio di errore (usa il parametro UseBasicParsing)
bluuf

40
In tutta onestà, è facile vedere le parole "Internet Explorer" in un messaggio di errore e ignorare il resto del messaggio mentre si arrabbia ciecamente sul motivo per cui un'utilità della riga di comando ha una dipendenza da IE.
MisterZimbu

Risposte:


219

Nella tua richiesta web invoke usa semplicemente il parametro -UseBasicParsing

ad esempio nel tuo script (riga 2) dovresti usare:

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

Secondo la documentazione , questo parametro è necessario sui sistemi in cui IE non è installato o configurato:

Utilizza l'oggetto risposta per il contenuto HTML senza l'analisi DOM (Document Object Model). Questo parametro è obbligatorio quando Internet Explorer non è installato nei computer, ad esempio in un'installazione Server Core di un sistema operativo Windows Server.


17
Per i futuri visitatori interessati a ciò che UseBasicParsingsta facendo: 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.copiato da qui: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri

39

Per farlo funzionare senza modificare i tuoi script:

Ho trovato una soluzione qui: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

L'errore è probabilmente in arrivo perché IE non è stato ancora lanciato per la prima volta, facendo apparire la finestra sottostante. Avvialo e passa attraverso quella schermata, quindi il messaggio di errore non verrà più visualizzato. Non è necessario modificare alcuno script.

cioè prima finestra di avvio


Ha funzionato per me senza dover aggiornare tutti gli script da un server Server 2008 a Server 2012 R2 per un gruppo di processi automatizzati per utilizzare PowerShell. Questo ha utilizzato un account specifico, quindi ho dovuto eseguirlo con quell'account registrato sul server.
Bitcoin Murderous Maniac

11
Anche se questo elimina l'errore, la necessità di risolvere il problema tramite una GUI non è una risposta accettabile, dato che PowerShell è pensato per essere utilizzato come piattaforma di automazione. Questa risposta non funzionerà per tutti gli scenari, ad esempio, all'interno di una sessione remota di PowerShell.
Devon Dieffenbach

2
Utilizzare un oggetto Criteri di gruppo (GPO) per gestire la prima procedura guidata : Configurazione computer> Criteri> Modelli amministrativi> Componenti di Windows> Internet Explorer. Imposta il criterio "Impedisci l'esecuzione della procedura guidata di prima esecuzione" "su Abilitato e scegli un'opzione adatta a te.
techie007

stavo avendo questo problema sul proxy kubectly e questo è stato risolto quando uso curl. Grazie!
gpbaculio

Questo scenario non funzionerà anche se la tua app è all'interno di una sorta di gruppo di ridimensionamento automatico poiché la nuova istanza che viene avviata richiederà questo quotidiano / settimanale / ecc. Meglio usare -UseBasicParsing
Ryan C

10

È sicuro perché il comando Invoke-WebRequest ha una dipendenza dagli assembly di Internet Explorer e lo stanno invocando per analizzare il risultato come da comportamento predefinito. Come suggerisce Matt, puoi semplicemente avviare IE e fare la tua selezione nel prompt delle impostazioni che appare al primo avvio. E l'errore che si verifica scomparirà.

Ma questo è possibile solo se esegui i tuoi script PowerShell come lo stesso utente di Windows con cui hai avviato IE. Le impostazioni di IE vengono memorizzate nel tuo attuale profilo di Windows. Quindi se tu, come me, esegui la tua attività in uno scheduler su un server come utente SYSTEM, questo non funzionerà.

Quindi qui dovrai cambiare i tuoi script e aggiungere l'argomento -UseBasicParsing, come in questo esempio: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing


7

È possibile disabilitare la necessità di eseguire la prima configurazione di avvio di Internet Explorer eseguendo questo script PowerShell, che regolerà la proprietà del registro corrispondente:

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

Dopo questo, WebClient funzionerà senza problemi


Sfortunatamente questo funziona bene solo sulle versioni della GUI ma non su Windows Server Core.
Luca

1
@Luke va bene, cercherò di scoprire una soluzione per Windows Server Core
ujeenator

1

Ho avuto anche questo problema, e mentre -UseBasicParsing funzionerà per alcuni, se hai effettivamente bisogno di interagire con il dom non funzionerà. Prova a utilizzare un criterio di gruppo per impedire la visualizzazione della finestra di configurazione iniziale e PowerShell non ti fermerà più. Vedere qui https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Mi ci sono voluti solo pochi minuti una volta trovata questa pagina, una volta impostato il GP, powershell ti permetterà di passare.


1

Nella tua richiesta web invoke usa semplicemente il parametro -UseBasicParsing

ad esempio nel tuo script (riga 2) dovresti usare:

$rss = Invoke-WebRequest -UseBasicParsing

Secondo la documentazione, questo parametro è necessario sui sistemi in cui IE non è installato o configurato.

Utilizza l'oggetto risposta per il contenuto HTML senza l'analisi DOM (Document Object Model). Questo parametro è obbligatorio quando Internet Explorer non è installato nei computer, ad esempio in un'installazione Server Core di un sistema operativo Windows Server.


0

Ancora un altro metodo per risolvere: l'aggiornamento del registro. Nel mio caso non ho potuto modificare l'oggetto Criteri di gruppo e -UseBasicParsing interrompe parti dell'accesso al sito web. Inoltre avevo un utente del servizio senza autorizzazioni di accesso, quindi non potevo accedere come utente ed eseguire la GUI.
Aggiustare,

  1. accedi come un utente normale, esegui l'installazione di IE.
  2. Quindi esportare questa chiave di registro: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. Nel file .reg salvato, sostituire l'utente sid con l'account di servizio sid
  4. Importa il file .reg

Nel file

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.