ไม่สามารถแยกวิเคราะห์เนื้อหาการตอบกลับเนื่องจากโปรแกรม Internet Explorer ไม่พร้อมใช้งานหรือ


116

ฉันต้องการดาวน์โหลดซีรีส์ช่อง 9 โดยใช้ powershell อย่างไรก็ตามสคริปต์ที่ฉันลองมีข้อผิดพลาด:

  1. สคริปต์นี้

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

    ล้มเหลวด้วยข้อผิดพลาด:

    ไม่สามารถแยกวิเคราะห์เนื้อหาการตอบกลับเนื่องจากโปรแกรม Internet Explorer ไม่พร้อมใช้งานหรือการกำหนดค่าการเปิดตัวครั้งแรกของ Internet Explorer ไม่สมบูรณ์ ระบุพารามิเตอร์ UseBasicParsing แล้วลองอีกครั้ง

  2. ฉันลองอันนี้ด้วย

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

    มีข้อผิดพลาดมากเกินไป

    http://screencast.com/t/bgGd0s98Uc


2
คำตอบสำหรับปัญหาของคุณอยู่ในข้อความแสดงข้อผิดพลาด (ใช้พารามิเตอร์ UseBasicParsing)
bluuf

44
ในความเป็นธรรมคุณสามารถเห็นคำว่า "Internet Explorer" ในข้อความแสดงข้อผิดพลาดได้โดยง่ายและเพิกเฉยต่อข้อความที่เหลือในขณะที่คุณกำลังโกรธคนตาบอดว่าเหตุใดยูทิลิตี้บรรทัดคำสั่งจึงต้องพึ่งพา IE
MisterZimbu

คำตอบ:


230

ในคำขอเว็บเรียกใช้เพียงแค่ใช้พารามิเตอร์ -UseBasicParsing

เช่นในสคริปต์ของคุณ (บรรทัดที่ 2) คุณควรใช้:

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

ตามเอกสารประกอบพารามิเตอร์นี้จำเป็นสำหรับระบบที่ไม่ได้ติดตั้งหรือกำหนดค่า IE:

ใช้อ็อบเจ็กต์การตอบสนองสำหรับเนื้อหา HTML โดยไม่มีการแยกวิเคราะห์ Document Object Model (DOM) พารามิเตอร์นี้จำเป็นเมื่อไม่ได้ติดตั้ง Internet Explorer บนคอมพิวเตอร์เช่นบนการติดตั้ง Server Core ของระบบปฏิบัติการ Windows Server


19
สำหรับผู้เยี่ยมชมในอนาคตที่สนใจในสิ่งที่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.คัดลอกจากที่นี่: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri

ฉันติดตั้ง Internet Explorer บนเซิร์ฟเวอร์นี้และได้รับการตั้งค่าแล้ว และยังต้องใช้ -UseBasicParsing ไม่แน่ใจว่าทำไม
Don Rolling

42

เพื่อให้ทำงานได้โดยไม่ต้องแก้ไขสคริปต์ของคุณ:

ฉันพบวิธีแก้ปัญหาที่นี่: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

ข้อผิดพลาดอาจเกิดขึ้นเนื่องจาก IE ยังไม่ได้เปิดตัวเป็นครั้งแรกโดยจะเปิดหน้าต่างด้านล่าง เปิดใช้งานและผ่านหน้าจอนั้นจากนั้นข้อความแสดงข้อผิดพลาดจะไม่ปรากฏขึ้นอีก ไม่ต้องแก้ไขสคริปต์ใด ๆ

คือหน้าต่างเปิดตัวครั้งแรก


ทำงานให้ฉันโดยไม่ต้องอัปเดตสคริปต์ทั้งหมดจากเซิร์ฟเวอร์ 2008 ไปยังเซิร์ฟเวอร์ 2012 R2 สำหรับกระบวนการอัตโนมัติจำนวนมากเพื่อใช้ PowerShell สิ่งนี้ใช้บัญชีเฉพาะดังนั้นฉันจึงต้องดำเนินการผ่านสิ่งนี้ด้วยบัญชีนั้นที่ลงชื่อเข้าใช้เซิร์ฟเวอร์
Bitcoin Murderous Maniac

12
แม้ว่าสิ่งนี้จะกำจัดข้อผิดพลาด แต่ความจำเป็นในการแก้ปัญหาผ่าน GUI ไม่ใช่คำตอบที่ยอมรับได้เนื่องจาก PowerShell มีไว้เพื่อใช้เป็นแพลตฟอร์มอัตโนมัติ คำตอบนี้ใช้ไม่ได้กับทุกสถานการณ์เช่นภายใน PowerShell Remoting Session
Devon Dieffenbach

2
ใช้ Group Policy Object (GPO) เพื่อจัดการกับวิซาร์ดการรันครั้งแรก : Computer Configuration> Policies> Administrative Templates> Windows Components> Internet Explorer ตั้งค่านโยบาย "ป้องกันการรันวิซาร์ดการรันครั้งแรก" เป็นเปิดใช้งานแล้วเลือกตัวเลือกที่เหมาะกับคุณ
techie007

ฉันมีปัญหานี้ใน kubectly proxy และสิ่งนี้ได้รับการแก้ไขเมื่อฉันใช้ curl ขอบคุณ!
gpbaculio

สถานการณ์นี้จะใช้ไม่ได้เช่นกันหากคุณมีแอปของคุณอยู่ในกลุ่มการปรับขนาดอัตโนมัติบางประเภทเนื่องจากอินสแตนซ์ใหม่ที่กำลังหมุนจะต้องใช้สิ่งนี้ทุกวัน / สัปดาห์ / ฯลฯ ควรใช้ -UseBasicParsing
Ryan C

10

เป็นที่แน่นอนเนื่องจากคำสั่ง Invoke-WebRequest มีการพึ่งพาแอสเซมบลีของ Internet Explorer และกำลังเรียกใช้เพื่อแยกวิเคราะห์ผลลัพธ์ตามลักษณะการทำงานเริ่มต้น ตามที่ Matt แนะนำคุณสามารถเปิด IE และทำการเลือกในพรอมต์การตั้งค่าซึ่งจะปรากฏขึ้นเมื่อเปิดตัวครั้งแรก และข้อผิดพลาดที่คุณพบจะหายไป

แต่จะเป็นไปได้ก็ต่อเมื่อคุณเรียกใช้สคริปต์ powershell ในฐานะผู้ใช้ windows เดียวกับที่คุณเปิดใช้งาน IE ด้วย การตั้งค่า IE จะถูกเก็บไว้ในโปรไฟล์ windows ปัจจุบันของคุณ ดังนั้นถ้าคุณเช่นฉันรันงานของคุณในตัวกำหนดตารางเวลาบนเซิร์ฟเวอร์ในฐานะผู้ใช้ SYSTEM สิ่งนี้จะไม่ทำงาน

ดังนั้นที่นี่คุณจะต้องเปลี่ยนสคริปต์ของคุณและเพิ่มอาร์กิวเมนต์ -UseBasicParsing ดังตัวอย่างนี้: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing


7

คุณสามารถปิดใช้งานความจำเป็นในการเรียกใช้การกำหนดค่าการเปิดตัวครั้งแรกของ Internet Explorer โดยการเรียกใช้สคริปต์ PowerShell นี้ซึ่งจะปรับคุณสมบัติของรีจิสทรีที่เกี่ยวข้อง:

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

หลังจากนี้ WebClient จะทำงานได้โดยไม่มีปัญหา


น่าเสียดายที่สิ่งนี้ใช้งานได้ดีกับเวอร์ชัน GUI เท่านั้น แต่ไม่ใช่บน Windows Server Core
Luke

1
@ ลุคโอเคฉันจะพยายามค้นหาโซลูชันสำหรับ Windows Server Core
ujeenator

1

ฉันมีปัญหานี้เช่นกันและในขณะที่ -UseBasicParsing จะใช้ได้กับบางคนหากคุณจำเป็นต้องโต้ตอบกับ Dom จริง ๆ มันจะไม่ได้ผล ลองใช้นโยบายกลุ่มเพื่อหยุดไม่ให้หน้าต่างการกำหนดค่าเริ่มต้นปรากฏขึ้นและ powershell จะไม่หยุดคุณอีกต่อไป ดูที่นี่ https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

ใช้เวลาเพียงไม่กี่นาทีเมื่อฉันพบหน้านี้เมื่อตั้งค่า GP แล้ว powershell จะช่วยให้คุณผ่าน


1

ในคำขอเว็บเรียกใช้เพียงแค่ใช้พารามิเตอร์ -UseBasicParsing

เช่นในสคริปต์ของคุณ (บรรทัดที่ 2) คุณควรใช้:

$rss = Invoke-WebRequest -UseBasicParsing

ตามเอกสารประกอบพารามิเตอร์นี้จำเป็นสำหรับระบบที่ไม่ได้ติดตั้งหรือกำหนดค่า IE

ใช้อ็อบเจ็กต์การตอบสนองสำหรับเนื้อหา HTML โดยไม่มีการแยกวิเคราะห์ Document Object Model (DOM) พารามิเตอร์นี้จำเป็นเมื่อไม่ได้ติดตั้ง Internet Explorer บนคอมพิวเตอร์เช่นบนการติดตั้ง Server Core ของระบบปฏิบัติการ Windows Server


0

อีกวิธีหนึ่งในการแก้ปัญหา: การอัปเดตรีจิสทรี ในกรณีของฉันฉันไม่สามารถแก้ไข GPO ได้และ -UseBasicParsing จะแบ่งบางส่วนของการเข้าถึงเว็บไซต์ นอกจากนี้ฉันมีผู้ใช้บริการที่ไม่มีสิทธิ์เข้าสู่ระบบดังนั้นฉันจึงไม่สามารถเข้าสู่ระบบในฐานะผู้ใช้และเรียกใช้ GUI ได้
เพื่อแก้ไข,

  1. เข้าสู่ระบบในฐานะผู้ใช้ปกติเรียกใช้การตั้งค่า IE
  2. จากนั้นส่งออกคีย์รีจิสทรีนี้: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. ในไฟล์. reg ที่บันทึกไว้ให้แทนที่ผู้ใช้ sid ด้วย sid บัญชีบริการ
  4. นำเข้าไฟล์. reg

ในไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.