Der Antwortinhalt kann nicht analysiert werden, da die Internet Explorer-Engine nicht verfügbar ist

98

Ich muss eine Channel 9-Serie mit Powershell herunterladen, aber die Skripte, die ich ausprobiert habe, weisen Fehler auf:

  1. Dieses Skript

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

    fehlgeschlagen mit Fehler:

    Der Antwortinhalt kann nicht analysiert werden, da die Internet Explorer-Engine nicht verfügbar ist oder die Erststartkonfiguration von Internet Explorer nicht vollständig ist. Geben Sie den Parameter UseBasicParsing an und versuchen Sie es erneut.

  2. Ich habe es auch versucht

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

    mit zu vielen Fehlern

    http://screencast.com/t/bgGd0s98Uc

Luis Valencia
quelle
2
Die Antwort auf Ihr Problem ist IN der Fehlermeldung (verwenden Sie den Parameter UseBasicParsing)
bluuf
34
Fairerweise ist es einfach, die Wörter "Internet Explorer" in einer Fehlermeldung zu sehen und den Rest der Nachricht zu ignorieren, wenn Sie in blinde Wut geraten, warum ein Befehlszeilenprogramm von IE abhängig ist.
MisterZimbu

Antworten:

205

Verwenden Sie in Ihrer aufgerufenen Webanforderung einfach den Parameter -UseBasicParsing

zB in Ihrem Skript (Zeile 2) sollten Sie verwenden:

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

Gemäß der Dokumentation ist dieser Parameter auf Systemen erforderlich, auf denen der IE nicht installiert oder konfiguriert ist:

Verwendet das Antwortobjekt für HTML-Inhalte ohne DOM-Analyse (Document Object Model). Dieser Parameter ist erforderlich, wenn Internet Explorer nicht auf den Computern installiert ist, z. B. bei einer Server Core-Installation eines Windows Server-Betriebssystems.

Franco Pettigrosso
quelle
16
Für zukünftige Besucher, die daran interessiert sind, was zu UseBasicParsingtun ist: 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.von hier kopiert: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri
38

So funktioniert es, ohne Ihre Skripte zu ändern:

Ich habe hier eine Lösung gefunden: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Der Fehler tritt wahrscheinlich auf, weil der IE noch nicht zum ersten Mal gestartet wurde und das folgende Fenster geöffnet wird. Starten Sie es und gehen Sie durch diesen Bildschirm, und dann wird die Fehlermeldung nicht mehr angezeigt. Es müssen keine Skripte geändert werden.

dh erstes Startfenster

Matt Hyde
quelle
Hat für mich funktioniert, ohne dass alle Skripts von einem Server 2008-Server auf Server 2012 R2 aktualisiert werden mussten, damit eine Reihe automatisierter Prozesse PowerShell verwenden können. Dies verwendete ein bestimmtes Konto, so dass ich dies tatsächlich mit diesem auf dem Server angemeldeten Konto durchlaufen musste.
Bitcoin Murderous Maniac
11
Dadurch wird der Fehler zwar behoben, die Notwendigkeit, das Problem über eine grafische Benutzeroberfläche zu lösen, ist jedoch keine akzeptable Antwort, da PowerShell als Automatisierungsplattform verwendet werden soll. Diese Antwort funktioniert nicht für alle Szenarien, z. B. innerhalb einer PowerShell-Remoting-Sitzung.
Devon Dieffenbach
2
Verwenden Sie ein Gruppenrichtlinienobjekt (Group Policy Object, GPO), um den Assistenten für die erste Ausführung auszuführen : Computerkonfiguration> Richtlinien> Administrative Vorlagen> Windows-Komponenten> Internet Explorer. Setzen Sie die Richtlinie "Verhinderung der Ausführung des ersten Ausführungsassistenten" auf Aktiviert und wählen Sie eine Option aus, die zu Ihnen passt.
techie007
Ich hatte dieses Problem auf Kubectly Proxy und dies behoben, wenn ich Curl verwenden. Vielen Dank!
gpbaculio
Dieses Szenario funktioniert auch nicht, wenn sich Ihre App in einer Art automatischer Skalierungsgruppe befindet, da die neue Instanz, die hochgefahren wird, dies täglich / wöchentlich / etc. Erfordert. Verwenden Sie am besten das -UseBasicParsing
Ryan C
10

Dies ist sicher, da der Befehl Invoke-WebRequest von den Internet Explorer-Assemblys abhängig ist und diese aufruft, um das Ergebnis gemäß dem Standardverhalten zu analysieren. Wie Matt vorschlägt, können Sie einfach den IE starten und Ihre Auswahl in der Eingabeaufforderung treffen, die beim ersten Start angezeigt wird. Und der Fehler, den Sie erleben, wird verschwinden.

Dies ist jedoch nur möglich, wenn Sie Ihre Powershell-Skripte als denselben Windows-Benutzer ausführen, mit dem Sie den IE gestartet haben. Die IE-Einstellungen werden unter Ihrem aktuellen Windows-Profil gespeichert. Wenn Sie also wie ich Ihre Aufgabe in einem Scheduler auf einem Server als SYSTEM-Benutzer ausführen, funktioniert dies nicht.

Hier müssen Sie also Ihre Skripte ändern und das Argument -UseBasicParsing hinzufügen, wie in diesem Beispiel dargestellt: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

Peter Stjernholm Meldgaard
quelle
5

Sie können die Notwendigkeit zum Ausführen der ersten Startkonfiguration von Internet Explorer deaktivieren, indem Sie dieses PowerShell-Skript ausführen. Dadurch wird die entsprechende Registrierungseigenschaft angepasst:

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

Danach funktioniert WebClient ohne Probleme

ujeenator
quelle
Leider funktioniert dies nur unter GUI-Versionen, nicht jedoch unter Windows Server Core.
Luke
1
@ Luke okay, ich werde versuchen, eine Lösung für Windows Server Core
Ujeenator
1

Verwenden Sie in Ihrer aufgerufenen Webanforderung einfach den Parameter -UseBasicParsing

zB in Ihrem Skript (Zeile 2) sollten Sie verwenden:

$rss = Invoke-WebRequest -UseBasicParsing

Laut Dokumentation ist dieser Parameter auf Systemen erforderlich, auf denen der IE nicht installiert oder konfiguriert ist.

Verwendet das Antwortobjekt für HTML-Inhalte ohne DOM-Analyse (Document Object Model). Dieser Parameter ist erforderlich, wenn Internet Explorer nicht auf den Computern installiert ist, z. B. bei einer Server Core-Installation eines Windows Server-Betriebssystems.

Vinay
quelle
0

Ich hatte auch dieses Problem, und während -UseBasicParsing für einige funktioniert, funktioniert es nicht, wenn Sie tatsächlich mit dem Dom interagieren müssen. Verwenden Sie eine Gruppenrichtlinie, um zu verhindern, dass das Fenster für die Erstkonfiguration jemals angezeigt wird, und Powershell hält Sie nicht mehr auf. Siehe hier https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Ich habe nur ein paar Minuten gebraucht, als ich diese Seite gefunden habe. Sobald der GP eingestellt ist, wird Powershell Sie durchlassen.

eragon2262
quelle
0

Noch eine andere zu lösende Methode: Aktualisierung der Registrierung. In meinem Fall konnte ich das Gruppenrichtlinienobjekt nicht ändern, und -UseBasicParsing unterbricht Teile des Zugriffs auf die Website. Außerdem hatte ich einen Dienstbenutzer ohne Anmeldeberechtigungen, sodass ich mich nicht als Benutzer anmelden und die GUI ausführen konnte.
Reparieren,

  1. Melden Sie sich als normaler Benutzer an und führen Sie das IE-Setup aus.
  2. Exportieren Sie dann diesen Registrierungsschlüssel: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. Ersetzen Sie in der gespeicherten .reg-Datei die Benutzerseite durch die Dienstkontoseite
  4. Importieren Sie die REG-Datei

In der Datei

rayzinnz
quelle