Yanıt içeriği, Internet Explorer motoru kullanılamadığından ayrıştırılamıyor veya


110

Powershell kullanarak bir kanal 9 serisi indirmem gerekiyor, ancak denediğim komut dosyalarında hatalar var:

  1. Bu komut dosyası

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

    hata ile başarısız oldu:

    Yanıt içeriği, Internet Explorer motoru kullanılamadığından veya Internet Explorer'ın ilk başlatma yapılandırması tamamlanmadığından ayrıştırılamıyor. UseBasicParsing parametresini belirtin ve tekrar deneyin.

  2. Bunu da denedim

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

    çok fazla hatayla

    http://screencast.com/t/bgGd0s98Uc


2
Sorununuzun cevabı hata mesajında ​​(UseBasicParsing parametresini kullanın)
bluuf

41
Doğrusu, bir hata mesajında ​​"Internet Explorer" kelimelerini görmek ve bir komut satırı yardımcı programının neden IE'ye bağımlı olduğu konusunda kör bir öfkeye kapılırken mesajın geri kalanını görmezden gelmek kolaydır.
MisterZimbu

Yanıtlar:


222

Çağrı web isteğinizde sadece parametreyi kullanın -UseBasicParsing

örneğin betiğinizde (2. satır) kullanmalısınız:

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

Belgelere göre , bu parametre IE'nin kurulu olmadığı veya yapılandırılmadığı sistemlerde gereklidir:

Belge Nesne Modeli (DOM) ayrıştırması olmadan HTML içeriği için yanıt nesnesini kullanır. Bu parametre, Windows Server işletim sisteminin Sunucu Çekirdeği yüklemesi gibi bilgisayarlarda Internet Explorer kurulu olmadığında gereklidir.


17
Ne yaptığıyla ilgilenen gelecekteki ziyaretçiler için UseBasicParsing: 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.buradan kopyalandı: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri

Bu sunucuda Internet Explorer yüklüyüm ve kuruldu. Ve yine de -UseBasicParsing gerektirir. Emin değilim neden.
Don Rolling

39

Komut dosyalarınızı değiştirmeden çalışmasını sağlamak için:

Burada bir çözüm buldum: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Hata muhtemelen ortaya çıkıyor çünkü IE henüz ilk kez başlatılmamış ve aşağıdaki pencereyi açıyor. Başlatın ve bu ekrandan geçin, ardından hata mesajı bir daha çıkmayacaktır. Herhangi bir komut dosyasını değiştirmeye gerek yok.

yani ilk başlatma penceresi


PowerShell'i kullanmak için bir grup otomatik işlem için bir Server 2008 sunucusundan Server 2012 R2'ye tüm komut dosyalarını güncellemek zorunda kalmadan benim için çalıştı. Bu belirli bir hesap kullanıyordu, bu yüzden gerçekten bunu sunucuda imzalanan hesapla çalıştırmam gerekti.
Bitcoin Murderous Maniac

11
Bu, hatayı ortadan kaldırsa da, PowerShell'in bir otomasyon platformu olarak kullanılması düşünüldüğünde, sorunu bir GUI aracılığıyla çözme ihtiyacı kabul edilebilir bir cevap değildir. Bu yanıt, örneğin bir PowerShell Uzaktan Erişim Oturumu içindeki tüm senaryolar için çalışmayacaktır.
Devon Dieffenbach

2
İlk çalıştırma sihirbazını işlemek için bir Grup İlkesi Nesnesi (GPO) kullanın : Bilgisayar Yapılandırması> İlkeler> Yönetim Şablonları> Windows Bileşenleri> Internet Explorer. "İlk Çalıştırma sihirbazını çalıştırmayı önle" "politikasını Etkin olarak ayarlayın ve size uygun bir seçenek belirleyin.
techie007

Bu sorunu kubectly proxy'de yaşıyordum ve curl kullandığımda bu düzeltildi. Teşekkürler!
gpbaculio

Bu senaryo, uygulamanızı bir tür otomatik ölçeklendirme grubunun içindeyse, döndürülen yeni örnek bunu günlük / haftalık / vb. Gerektireceğinden işe yaramayacaktır. -UseBasicParsing'i kullanmak için en iyisi
Ryan C

10

Invoke-WebRequest komutunun Internet Explorer derlemelerine bir bağımlılığı olduğundan ve sonucu varsayılan davranışa göre ayrıştırmak için onu çağırdığından emin olunur. Matt'in önerdiği gibi, basitçe IE'yi başlatabilir ve ilk çalıştırmada açılan ayarlar komut isteminde seçiminizi yapabilirsiniz. Ve yaşadığınız hata ortadan kalkacaktır.

Ancak bu, yalnızca powershell komut dosyalarınızı IE'yi başlattığınız Windows kullanıcısı ile çalıştırırsanız mümkündür. IE ayarları, mevcut Windows profilinizin altında saklanır. Yani, benim gibi görevinizi bir zamanlayıcıda bir sunucuda SİSTEM kullanıcısı olarak çalıştırırsanız, bu çalışmayacaktır.

Yani burada komut dosyalarınızı değiştirmeniz ve bu örnekte olduğu gibi -UseBasicParsing argümanını eklemeniz gerekecek: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing


7

Bu PowerShell komut dosyasını çalıştırarak Internet Explorer'ın ilk başlatma yapılandırmasını çalıştırma ihtiyacını devre dışı bırakabilirsiniz, ilgili kayıt defteri özelliğini ayarlar:

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

Bundan sonra WebClient sorunsuz çalışacaktır.


Ne yazık ki bu sadece GUI sürümlerinde iyi çalışıyor ancak Windows Server Core'da çalışmıyor.
Luke

1
@Luke tamam, Windows Server Core için bir çözüm bulmaya çalışacağım
ujeenator

1

Ben de bu sorunu yaşadım ve -UseBasicParsing bazıları için işe yarayacak, eğer gerçekten dom ile etkileşime girmeniz gerekiyorsa işe yaramayacak. İlk yapılandırma penceresinin görünmesini engellemek için bir grup ilkesi kullanmayı deneyin; powershell artık sizi durdurmayacaktır. Buraya bakın https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

GP ayarlandıktan sonra, bu sayfayı bulduğumda bana sadece birkaç dakika sürdü, powershell size izin verecek.


1

Çağrılan web isteğinizde sadece -UseBasicParsing parametresini kullanın.

örneğin betiğinizde (2. satır) kullanmalısınız:

$rss = Invoke-WebRequest -UseBasicParsing

Belgelere göre, bu parametre IE'nin kurulu olmadığı veya yapılandırılmadığı sistemlerde gereklidir.

Belge Nesne Modeli (DOM) ayrıştırması olmadan HTML içeriği için yanıt nesnesini kullanır. Bu parametre, Windows Server işletim sisteminin Sunucu Çekirdeği yüklemesi gibi bilgisayarlarda Internet Explorer kurulu olmadığında gereklidir.


0

Çözülecek başka bir yöntem: kayıt defterini güncelleme. Benim durumumda GPO'yu değiştiremedim ve -UseBasicParsing web sitesine erişimin bazı kısımlarını bozuyor. Ayrıca oturum açma izinleri olmayan bir hizmet kullanıcım vardı, bu yüzden kullanıcı olarak oturum açıp GUI'yi çalıştıramadım.
Düzeltmek,

  1. normal bir kullanıcı olarak oturum açın, IE kurulumunu çalıştırın.
  2. Ardından bu kayıt defteri anahtarını dışa aktarın: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. Kaydedilen .reg dosyasında, kullanıcı kimliğini hizmet hesabı sid ile değiştirin
  4. .Reg dosyasını içe aktarın

Dosyanın içinde

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.