161 votes

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

J'ai besoin de 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 allons le sauter 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 premier lancement d'Internet Explorer n'est pas terminée. Spécifiez le paramètre UseBasicParsing et réessayez.

  2. J'ai aussi 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(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 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

Pour être honnête, 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 la dépendance d'un utilitaire en ligne de commande à 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 des systèmes où IE n'est pas installé ou configuré :

Utilise l'objet de réponse pour le contenu HTML sans analyse du Document Object Model (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 fait UseBasicParsing : 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 de serveur 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, puis le système constate que IE n'est pas configuré pour cet utilisateur.

62voto

Matt Hyde Points 709

Pour faire fonctionner cela 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, faisant apparaître la fenêtre ci-dessous. Lancez-le et passez à travers cette fenêtre, puis le message d'erreur ne se produira plus. Pas besoin de modifier des scripts.

fenêtre de premier lancement d'IE

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 effectivement dû suivre cela avec ce compte connecté sur le serveur.

19 votes

Bien que cela élimine 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 dans tous les scénarios, par exemple, lors d'une session de PowerShell à distance.

2 votes

Utiliser 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 première exécution d'Internet Explorer en exécutant ce script PowerShell, il ajustera la propriété du 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 correctement 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

C'est certain car la commande Invoke-WebRequest a une dépendance sur les assemblies d'Internet Explorer et les invoque pour analyser le résultat selon le comportement par défaut. Comme Matt le suggère, vous pouvez simplement lancer IE et faire votre sélection dans la fenêtre de paramètres qui s'affiche au premier lancement. Et l'erreur que vous rencontrez disparaîtra.

Mais cela est seulement possible 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 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ù 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 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