O conteúdo da resposta não pode ser analisado porque o mecanismo do Internet Explorer não está disponível ou

101

Preciso baixar uma série do canal 9 usando o PowerShell, mas os scripts que tentei apresentam erros:

  1. Este 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{ 
        "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 
      } 
    }

    falhou com erro:

    O conteúdo da resposta não pode ser analisado porque o mecanismo do Internet Explorer não está disponível ou a configuração de primeira inicialização do Internet Explorer não está completa. Especifique o parâmetro UseBasicParsing e tente novamente.

  2. Eu também tentei este

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

    com muitos erros

    http://screencast.com/t/bgGd0s98Uc

Luis valencia
fonte
2
A resposta para o seu problema está NA mensagem de erro (use o parâmetro UseBasicParsing)
bluuf
36
Para ser justo, é fácil ver as palavras "Internet Explorer" em uma mensagem de erro e ignorar o resto da mensagem enquanto você fica furioso com o motivo de um utilitário de linha de comando depender do IE.
MisterZimbu de

Respostas:

209

Em sua solicitação da web invoke, apenas use o parâmetro -UseBasicParsing

por exemplo, em seu script (linha 2) você deve usar:

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

De acordo com a documentação , este parâmetro é necessário em sistemas onde o IE não está instalado ou configurado:

Usa o objeto de resposta para conteúdo HTML sem análise de Document Object Model (DOM). Este parâmetro é necessário quando o Internet Explorer não está instalado nos computadores, como em uma instalação Server Core de um sistema operacional Windows Server.

Franco Pettigrosso
fonte
16
Para futuros visitantes interessados ​​no que UseBasicParsingestá fazendo: 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.copiado daqui: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri
38

Para fazer funcionar sem modificar seus scripts:

Encontrei uma solução aqui: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

O erro provavelmente está ocorrendo porque o IE ainda não foi iniciado pela primeira vez, exibindo a janela abaixo. Lance-o e passe por aquela tela, então a mensagem de erro não aparecerá mais. Não há necessidade de modificar nenhum script.

ie primeira janela de lançamento

Matt Hyde
fonte
Funcionou para mim sem ter que atualizar todos os scripts de um servidor Server 2008 para Server 2012 R2 para um monte de processos automatizados para usar o PowerShell. Isso usou uma conta específica, então eu realmente tive que passar por isso com aquela conta conectada ao servidor.
Bitcoin Murderous Maniac
11
Embora isso elimine o erro, a necessidade de resolver o problema por meio de uma GUI não é uma resposta aceitável, visto que o PowerShell foi feito para ser usado como uma plataforma de automação. Esta resposta não funcionará para todos os cenários, por exemplo, em uma sessão remota do PowerShell.
Devon Dieffenbach
2
Use um objeto de política de grupo (GPO) para lidar com a primeira execução do assistente : Configuração do computador> Políticas> Modelos administrativos> Componentes do Windows> Internet Explorer. Defina a política de "Prevenção de execução do assistente de primeira execução" "como Ativada e escolha uma opção que seja adequada a você.
techie007
Eu estava tendo esse problema no proxy kubectly e isso foi corrigido quando eu uso o curl. Obrigado!
gpbaculio
Este cenário também não funcionará se você tiver seu aplicativo dentro de algum tipo de grupo de escalonamento automático, pois a nova instância que está sendo acelerada exigirá isso diário / semanal / etc. Melhor usar o -UseBasicParsing
Ryan C
10

É certo porque o comando Invoke-WebRequest depende dos assemblies do Internet Explorer e o invoca para analisar o resultado conforme o comportamento padrão. Como Matt sugere, você pode simplesmente iniciar o IE e fazer sua seleção no prompt de configurações que aparece na primeira inicialização. E o erro que você experimentou desaparecerá.

Mas isso só é possível se você executar seus scripts do PowerShell como o mesmo usuário do Windows com quem você iniciou o IE. As configurações do IE são armazenadas em seu perfil atual do Windows. Portanto, se você, como eu, executar sua tarefa em um planejador em um servidor como o usuário SYSTEM, isso não funcionará.

Portanto, aqui você terá que alterar seus scripts e adicionar o argumento -UseBasicParsing, como neste exemplo: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing

Peter Stjernholm Meldgaard
fonte
6

Você pode desabilitar a necessidade de executar a primeira configuração de inicialização do Internet Explorer executando este script do PowerShell, ele ajustará a propriedade de registro correspondente:

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

Depois disso, o WebClient funcionará sem problemas

ujeenator
fonte
Infelizmente, isso funciona bem apenas nas versões GUI, mas não no Windows Server Core.
Lucas
1
@Luke ok, vou tentar descobrir a solução para o Windows Server Core
ujeenator
1

Eu também tive esse problema e, embora -UseBasicParsing funcione para alguns, se você realmente precisar interagir com o dom, ele não funcionará. Tente usar uma política de grupo para impedir que a janela de configuração inicial apareça e o PowerShell não o impedirá mais. Veja aqui https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Levei apenas alguns minutos depois que encontrei esta página, uma vez que o GP for definido, o PowerShell permitirá que você passe.

eragon2262
fonte
1

Em sua solicitação da web invocar, basta usar o parâmetro -UseBasicParsing

por exemplo, em seu script (linha 2) você deve usar:

$rss = Invoke-WebRequest -UseBasicParsing

De acordo com a documentação, este parâmetro é necessário em sistemas onde o IE não está instalado ou configurado.

Usa o objeto de resposta para conteúdo HTML sem análise de Document Object Model (DOM). Este parâmetro é necessário quando o Internet Explorer não está instalado nos computadores, como em uma instalação Server Core de um sistema operacional Windows Server.

Vinay
fonte
0

Mais um método para resolver: atualizar o registro. No meu caso, não consegui alterar o GPO, e -UseBasicParsing interrompe partes do acesso ao site. Além disso, eu tinha um usuário de serviço sem permissões de login, então não pude fazer login como o usuário e executar a GUI.
Consertar,

  1. faça login como um usuário normal, execute a configuração do IE.
  2. Em seguida, exporte esta chave de registro: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. No arquivo .reg salvo, substitua o sid do usuário pelo sid da conta de serviço
  4. Importe o arquivo .reg

No arquivo

Rayzinnz
fonte