161 votes

Le contenu de la réponse ne peut pas être analysé car le moteur Internet Explorer n'est pas disponible, ou

Je dois télécharger une série d'épisodes du canal 9 en utilisant Powershell, cependant les scripts que j'ai essayés ont des erreurs:

  1. Ce 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{ 
        "Vérification de $($_.url.split("/")[-1]), nous le sauterons s'il existe déjà dans $($destination)"
      if(!(test-path ($destination + $_.url.split("/")[-1]))){ 
        "Téléchargement: " + $_.url 
        start-bitstransfer $_.url $destination 
      } 
    }

    a échoué avec l'erreur:

    Le contenu de la réponse ne peut pas être analysé car le moteur d'Internet Explorer n'est pas disponible, ou la configuration de première utilisation d'Internet Explorer n'est pas complète. Spécifiez le paramètre UseBasicParsing et réessayez.

  2. J'ai également essayé celui-ci

    # --- paramètres ---
    $feedUrl = "https://channel9.msdn.com/blogs/OfficeDevPnP/feed/mp4high"
    $mediaType = "mp4high"
    $overwrite = $false
    $destinationDirectory = join-path ([Environment]::GetFolderPath("MyDocuments")) "OfficeDevPnP"
    
    # --- locaux ---
    $webClient = New-Object System.Net.WebClient
    
    # --- fonctions ---
    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 déjà téléchargé" -status "$pagepercent% ($progress / $entries) complet" -percentcomplete $pagepercent
        }
        else 
        {
            write-progress -activity "Téléchargement de $fileName" -status "$pagepercent% ($progress / $entries) complet" -percentcomplete $pagepercent
           $webClient.DownloadFile($url, $tempFilename)
           rename-item $tempFilename $saveFileName
        }
        $pagepercent = [Math]::floor((++$progress)/$entries*100)
      }
    }  
    
    # --- faire le travail réel ---
    [string]$feedUrl = PromptForInput "Entrez l'URL du flux" $feedUrl
    [string]$mediaType = PromptForInput "Entrez le type de média`r`n(options:Wmv,WmvHigh,mp4,mp4high,zune,mp3)" $mediaType
    $feedUrl += $mediaType
    
    [string]$destinationDirectory = PromptForInput "Entrez le répertoire de destination" $destinationDirectory
    
    # si le dossier de destination n'existe pas, le créer
    if (!(Test-Path -path $destinationDirectory)) { New-Item $destinationDirectory -type directory }
    
    DownloadEntries $feedUrl

    avec trop d'erreurs

    http://screencast.com/t/bgGd0s98Uc

4 votes

La réponse à votre problème se trouve DANS le message d'erreur (utilisez le paramètre UseBasicParsing)

71 votes

En toute justice, il est facile de voir les mots "Internet Explorer" dans un message d'erreur et d'ignorer le reste du message alors que vous entrez dans une rage aveugle sur pourquoi une utilité en ligne de commande a une dépendance à IE.

305voto

Franco Pettigrosso Points 1191

Dans votre demande web invoke, utilisez simplement le paramètre -UseBasicParsing

Par exemple, dans votre script (ligne 2), vous devriez utiliser:

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

Selon la documentation, ce paramètre est nécessaire sur les systèmes où IE n'est pas installé ou configuré:

Utilise l'objet de réponse pour le contenu HTML sans analyse du modèle d'objet de document (DOM). Ce paramètre est requis lorsque Internet Explorer n'est pas installé sur les ordinateurs, comme sur une installation Server Core d'un système d'exploitation Windows Server.

28 votes

Pour les futurs visiteurs intéressés par ce que UseBasicParsing fait : Utilise l'objet réponse pour le contenu HTML sans l'analyse du Modèle d'Objet Document (DOM). Ce paramètre est requis lorsque Internet Explorer n'est pas installé sur les ordinateurs, par exemple lors d'une installation de base Server Core d'un système d'exploitation Windows Server. copié d'ici : docs.microsoft.com/de-de/powershell/module/…

1 votes

J'ai Internet Explorer installé sur ce serveur et il est configuré. Et il nécessite toujours -UseBasicParsing. Je ne sais pas pourquoi.

0 votes

Ne vous inquiétez pas, cela pourrait être dû au contexte utilisateur différent dans lequel votre script s'exécute et le système trouve alors que IE n'est pas configuré pour cet utilisateur.

62voto

Matt Hyde Points 709

Pour que cela fonctionne sans modifier vos scripts :

J'ai trouvé une solution ici : http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

L'erreur se produit probablement parce que IE n'a pas encore été lancé pour la première fois, ce qui entraîne l'affichage de la fenêtre ci-dessous. Lancez-le et passez cette fenêtre, puis le message d'erreur n'apparaîtra plus. Pas besoin de modifier vos scripts.

ie first launch window

0 votes

A fonctionné pour moi sans avoir à mettre à jour tous les scripts d'un serveur 2008 vers un serveur 2012 R2 pour un tas de processus automatisés utilisant PowerShell. Cela utilisait un compte spécifique, donc j'ai en effet dû exécuter ceci avec ce compte connecté au serveur.

19 votes

Alors que cela résout l'erreur, la nécessité de résoudre le problème via une interface graphique n'est pas une réponse acceptable, étant donné que PowerShell est censé être utilisé comme une plate-forme d'automatisation. Cette réponse ne fonctionnera pas pour tous les scénarios, par exemple, dans une session d'accès distant PowerShell.

2 votes

Utilisez un objet de stratégie de groupe (GPO) pour gérer l'assistant de première exécution : Configuration de l'ordinateur > Stratégies > Modèles d'administration > Composants Windows > Internet Explorer. Définissez la stratégie "Empêcher l'exécution de l'assistant de première exécution"" sur Activée et choisissez une option qui vous convient.

17voto

Amber de Black Points 244

Vous pouvez désactiver le besoin d'exécuter la configuration de premier lancement d'Internet Explorer en exécutant ce script PowerShell, il ajustera la propriété de registre correspondante :

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

Après cela, WebClient fonctionnera sans problème.

1 votes

Malheureusement, cela fonctionne bien uniquement sur les versions GUI mais pas sur Windows Server Core.

1 votes

@Luke d'accord, je vais essayer de découvrir une solution pour Windows Server Core

10voto

C'est sûr car la commande Invoke-WebRequest dépend des assembleurs d'Internet Explorer et les invoque pour analyser le résultat selon le comportement par défaut. Comme l'a suggéré Matt, vous pouvez simplement lancer IE et faire votre sélection dans l'invite de paramètres qui apparaît au premier lancement. Et l'erreur que vous rencontrez disparaîtra.

Mais cela n'est possible que si vous exécutez vos scripts powershell en tant que même utilisateur Windows que celui avec lequel vous avez lancé IE. Les paramètres d'IE sont stockés sous votre profil Windows actuel. Donc si vous, comme moi, exécutez votre tâche dans un planificateur sur un serveur en tant qu'utilisateur SYSTEM, cela ne fonctionnera pas.

Donc ici, vous devrez modifier vos scripts et ajouter l'argument -UseBasicParsing, comme dans cet exemple : $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

3voto

Vinay Points 21

Dans votre demande web invoke, utilisez simplement le paramètre -UseBasicParsing

par exemple dans votre script (ligne 2) vous devriez utiliser:

$rss = Invoke-WebRequest -UseBasicParsing

Selon la documentation, ce paramètre est nécessaire sur les systèmes où Internet Explorer n'est pas installé ou configuré.

Utilise l'objet de réponse pour le contenu HTML sans analyse du modèle objet du document (DOM). Ce paramètre est requis lorsque Internet Explorer n'est pas installé sur les ordinateurs, par exemple sur une installation Server Core d'un système d'exploitation Windows Server.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X