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 de chaîne 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 Internet Explorer n'est pas disponible, ou la configuration de premier démarrage 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(par défaut : $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 répertoire 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 un utilitaire en ligne de commande a une dépendance à IE.

305voto

Franco Pettigrosso Points 1191

Dans votre requête Web invoke, utilisez simplement le paramètre -UseBasicParsing

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

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

Conformément à 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 d'objet de document (DOM). Ce paramètre est requis lorsque Internet Explorer n'est pas installé sur les ordinateurs, comme sur une installation de base serveur 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 de réponse pour le contenu HTML sans analyse du modèle d'objet de document (DOM). Ce paramètre est nécessaire lorsque Internet Explorer n'est pas installé sur les ordinateurs, comme sur une installation 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

NeRolling, cela pourrait être un contexte utilisateur différent où votre script s'exécute et ensuite le système trouve que IE n'est pas configuré pour cet utilisateur

62voto

Matt Hyde Points 709

Pour le faire fonctionner 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 qu'Internet Explorer n'a pas encore été lancé pour la première fois, affichant la fenêtre ci-dessous. Lancez-le et passez cette étape, et alors le message d'erreur ne s'affichera plus. Pas besoin de modifier les scripts.

ie first launch window

0 votes

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

19 votes

En supprimant cette erreur, le besoin 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 plateforme d'automatisation. Cette réponse ne fonctionnera pas pour tous les scénarios, par exemple, dans une session de PowerShell à distance.

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é 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 lancement initial d'Internet Explorer en exécutant ce script PowerShell, il ajustera la propriété correspondante du registre :

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

Après cela, WebClient fonctionnera sans problèmes

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 trouver une solution pour Windows Server Core

10voto

Il est certain que la commande Invoke-WebRequest a une dépendance avec les assemblies 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 que l'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 requête 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ù IE n'est pas installé ou configuré.

Utiliser l'objet réponse pour le contenu HTML sans l'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.

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