Nie można przeanalizować treści odpowiedzi, ponieważ silnik programu Internet Explorer jest niedostępny lub

116

Muszę pobrać serię kanału 9 za pomocą PowerShell, jednak skrypty, które wypróbowałem, zawierają błędy:

  1. Ten skrypt

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

    nie powiodło się z błędem:

    Nie można przeanalizować treści odpowiedzi, ponieważ silnik programu Internet Explorer jest niedostępny lub konfiguracja pierwszego uruchomienia programu Internet Explorer nie została ukończona. Określ parametr UseBasicParsing i spróbuj ponownie.

  2. Próbowałem też tego

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

    ze zbyt dużą liczbą błędów

    http://screencast.com/t/bgGd0s98Uc

Luis Valencia
źródło
2
Odpowiedzią na twój problem jest komunikat o błędzie (użyj parametru UseBasicParsing)
bluuf
44
Mówiąc uczciwie, łatwo jest zobaczyć słowa „Internet Explorer” w komunikacie o błędzie i zignorować resztę komunikatu, wpadając w ślepą wściekłość na to, dlaczego narzędzie wiersza poleceń jest zależne od IE.
MisterZimbu

Odpowiedzi:

230

W żądaniu sieciowym invoke użyj po prostu parametru -UseBasicParsing

np. w swoim skrypcie (linia 2) powinieneś użyć:

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

Zgodnie z dokumentacją ten parametr jest niezbędny w systemach, w których IE nie jest zainstalowany ani skonfigurowany:

Używa obiektu odpowiedzi dla treści HTML bez analizowania modelu obiektu dokumentu (DOM). Ten parametr jest wymagany, jeśli program Internet Explorer nie jest zainstalowany na komputerach, na przykład w przypadku instalacji Server Core systemu operacyjnego Windows Server.

Franco Pettigrosso
źródło
19
Dla przyszłych odwiedzających zainteresowanych tym, co UseBasicParsingsię robi: 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.skopiowano stąd: docs.microsoft.com/de-de/powershell/module/ ...
Bruno Bieri,
Mam zainstalowaną przeglądarkę Internet Explorer na tym serwerze i jest skonfigurowana. I nadal wymaga -UseBasicParsing. Nie pewny dlaczego.
Don Rolling
42

Aby to działało bez modyfikowania skryptów:

Znalazłem rozwiązanie tutaj: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Błąd prawdopodobnie się pojawia, ponieważ IE nie został jeszcze uruchomiony po raz pierwszy, wyświetlając poniższe okno. Uruchom go i przejdź przez ten ekran, a wtedy komunikat o błędzie już się nie pojawi. Nie ma potrzeby modyfikowania żadnych skryptów.

tj. pierwsze okno uruchamiania

Matt Hyde
źródło
Pracował dla mnie bez konieczności aktualizowania wszystkich skryptów z serwera Server 2008 do Server 2012 R2 w celu wykonania kilku zautomatyzowanych procesów do korzystania z programu PowerShell. Używało to określonego konta, więc rzeczywiście musiałem przejść przez to z tym kontem zalogowanym na serwerze.
Bitcoin Murderous Maniac
12
Chociaż to eliminuje błąd, potrzeba rozwiązania problemu za pomocą graficznego interfejsu użytkownika nie jest akceptowalną odpowiedzią, biorąc pod uwagę, że PowerShell ma być używany jako platforma automatyzacji. Ta odpowiedź nie będzie działać dla wszystkich scenariuszy, na przykład w ramach sesji zdalnej programu PowerShell.
Devon Dieffenbach
2
Użyj obiektu zasad grupy (GPO) do obsługi kreatora pierwszego uruchomienia : Konfiguracja komputera> Zasady> Szablony administracyjne> Składniki systemu Windows> Internet Explorer. Ustaw
zasadę
Miałem ten problem z proxy kubectly i został on naprawiony, gdy używam curl. Dzięki!
gpbaculio
Ten scenariusz również nie zadziała, jeśli masz aplikację w jakiejś grupie automatycznego skalowania, ponieważ nowa tworzona instancja będzie wymagać tego codziennie / co tydzień / itp. Najlepiej używać -UseBasicParsing
Ryan C
10

Jest to pewne, ponieważ polecenie Invoke-WebRequest ma zależność od zestawów programu Internet Explorer i wywołuje je w celu przeanalizowania wyniku zgodnie z domyślnym zachowaniem. Jak sugeruje Matt, możesz po prostu uruchomić IE i dokonać wyboru w oknie ustawień, które pojawia się przy pierwszym uruchomieniu. A błąd, którego doświadczasz, zniknie.

Jest to jednak możliwe tylko wtedy, gdy uruchamiasz skrypty PowerShell jako ten sam użytkownik systemu Windows, z którym uruchomiłeś IE. Ustawienia IE są przechowywane w bieżącym profilu systemu Windows. Więc jeśli Ty, tak jak ja, uruchamiasz swoje zadanie w harmonogramie na serwerze jako użytkownik SYSTEM, to nie zadziała.

Więc tutaj będziesz musiał zmienić swoje skrypty i dodać argument -UseBasicParsing, tak jak w tym przykładzie: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

Peter Stjernholm Meldgaard
źródło
7

Możesz wyłączyć potrzebę uruchamiania konfiguracji pierwszego uruchomienia programu Internet Explorer, uruchamiając ten skrypt PowerShell, dostosuje on odpowiednią właściwość rejestru:

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

Po tym WebClient będzie działał bez problemów

ujeenator
źródło
Niestety działa to dobrze tylko w wersjach GUI, ale nie w systemie Windows Server Core.
Łukasz
1
@Luke okay, spróbuję znaleźć rozwiązanie dla Windows Server Core
ujeenator
1

Miałem również ten problem i chociaż -UseBasicParsing będzie działać dla niektórych, jeśli faktycznie potrzebujesz interakcji z domem, to nie zadziała. Spróbuj użyć zasad grupy, aby zatrzymać pojawianie się początkowego okna konfiguracji, a program PowerShell już Cię nie powstrzyma. Zobacz tutaj https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Zajęło mi to tylko kilka minut, gdy znalazłem tę stronę, po ustawieniu GP, PowerShell pozwoli ci przejść.

eragon2262
źródło
1

W wywołaniu żądania internetowego wystarczy użyć parametru -UseBasicParsing

np. w swoim skrypcie (linia 2) powinieneś użyć:

$rss = Invoke-WebRequest -UseBasicParsing

Zgodnie z dokumentacją parametr ten jest niezbędny w systemach, w których IE nie jest zainstalowany ani skonfigurowany.

Używa obiektu odpowiedzi dla treści HTML bez analizowania modelu obiektu dokumentu (DOM). Ten parametr jest wymagany, jeśli program Internet Explorer nie jest zainstalowany na komputerach, na przykład w przypadku instalacji Server Core systemu operacyjnego Windows Server.

Vinay
źródło
0

Jeszcze inna metoda rozwiązania: aktualizacja rejestru. W moim przypadku nie mogłem zmienić GPO, a -UseBasicParsing przerywa części dostępu do strony internetowej. Miałem również użytkownika usługi bez uprawnień do logowania, więc nie mogłem zalogować się jako użytkownik i uruchomić GUI.
Naprawić,

  1. zaloguj się jako zwykły użytkownik, uruchom instalację IE.
  2. Następnie wyeksportuj ten klucz rejestru: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. W zapisanym pliku .reg zamień identyfikator użytkownika na identyfikator konta usługi
  4. Zaimportuj plik .reg

W pliku

rayzinnz
źródło