Không thể phân tích cú pháp nội dung phản hồi vì công cụ Internet Explorer không khả dụng, hoặc


107

Tôi cần tải xuống loạt kênh 9 bằng powershell, tuy nhiên, các tập lệnh mà tôi đã thử có lỗi:

  1. Script này

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

    không thành công với lỗi:

    Không thể phân tích cú pháp nội dung phản hồi vì công cụ Internet Explorer không khả dụng hoặc cấu hình khởi chạy lần đầu tiên của Internet Explorer chưa hoàn tất. Chỉ định tham số UseBasicParsing và thử lại.

  2. Tôi cũng đã thử cái này

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

    với quá nhiều lỗi

    http://screencast.com/t/bgGd0s98Uc


2
Câu trả lời cho vấn đề của bạn là trong thông báo lỗi (sử dụng tham số UseBasicParsing)
bluuf

38
Công bằng mà nói, thật dễ dàng để nhìn thấy dòng chữ "Internet Explorer" trong một thông báo lỗi và bỏ qua phần còn lại của thông báo khi bạn rơi vào cơn thịnh nộ mù quáng về lý do tại sao tiện ích dòng lệnh lại phụ thuộc vào IE.
MisterZimbu

Câu trả lời:


218

Trong yêu cầu web gọi của bạn, chỉ cần sử dụng tham số -UseBasicParsing

ví dụ: trong tập lệnh của bạn (dòng 2), bạn nên sử dụng:

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

Theo tài liệu , tham số này cần thiết trên các hệ thống chưa cài đặt hoặc cấu hình IE:

Sử dụng đối tượng phản hồi cho nội dung HTML mà không cần phân tích cú pháp Mô hình đối tượng tài liệu (DOM). Tham số này là bắt buộc khi Internet Explorer không được cài đặt trên máy tính, chẳng hạn như cài đặt Server Core của hệ điều hành Windows Server.


17
Đối với những khách truy cập trong tương lai quan tâm đến những gì UseBasicParsingđang làm: 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.sao chép từ đây: docs.microsoft.com/de-de/powershell/module/…
Bruno Bieri

39

Để làm cho nó hoạt động mà không cần sửa đổi các tập lệnh của bạn:

Tôi đã tìm thấy giải pháp ở đây: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Lỗi có thể sắp xảy ra do IE chưa được khởi chạy lần đầu tiên, hiển thị cửa sổ bên dưới. Khởi động nó và đi qua màn hình đó, sau đó thông báo lỗi sẽ không xuất hiện nữa. Không cần phải sửa đổi bất kỳ tập lệnh nào.

tức là cửa sổ khởi chạy đầu tiên


Làm việc cho tôi mà không cần phải cập nhật tất cả các tập lệnh từ máy chủ Server 2008 lên Server 2012 R2 cho một loạt các quy trình tự động để sử dụng PowerShell. Điều này sử dụng một tài khoản cụ thể vì vậy tôi thực sự phải chạy qua điều này với tài khoản đó đã đăng nhập vào máy chủ.
Bitcoin giết người Maniac

11
Mặc dù điều này giúp loại bỏ lỗi nhưng Nhu cầu giải quyết vấn đề thông qua GUI không phải là một câu trả lời có thể chấp nhận được, vì PowerShell được sử dụng như một nền tảng tự động hóa. Ví dụ: câu trả lời này sẽ không hoạt động đối với tất cả các trường hợp trong Phiên khởi động lại PowerShell.
Devon Dieffenbach

2
Sử dụng Đối tượng chính sách nhóm (GPO) để xử lý trình hướng dẫn chạy lần đầu tiên : Cấu hình máy tính> Chính sách> Mẫu quản trị> Cấu phần Windows> Internet Explorer. Đặt "Ngăn chặn chạy First Run Wizard"" chính sách để Enabled và chọn một tùy chọn phù hợp với bạn.
techie007

tôi đã gặp sự cố này trên proxy kubectly và điều này đã được khắc phục khi tôi sử dụng curl. Cảm ơn!
gpbaculio

Kịch bản này cũng sẽ không hoạt động nếu bạn có ứng dụng của mình bên trong một số loại nhóm tự động mở rộng quy mô vì phiên bản mới đang được xoay vòng sẽ yêu cầu điều này hàng ngày / hàng tuần / v.v. Tốt nhất để sử dụng -UseBasicParsing
Ryan C

10

Điều này chắc chắn là do lệnh Invoke-WebRequest có sự phụ thuộc vào các hội đồng Internet Explorer và đang gọi nó để phân tích cú pháp kết quả theo hành vi mặc định. Theo gợi ý của Matt, bạn có thể chỉ cần khởi chạy IE và thực hiện lựa chọn của mình trong lời nhắc cài đặt bật lên ở lần khởi chạy đầu tiên. Và lỗi bạn gặp phải sẽ biến mất.

Nhưng điều này chỉ có thể thực hiện được nếu bạn chạy các tập lệnh powershell của mình với cùng một người dùng windows mà bạn đã khởi chạy IE cùng. Cài đặt IE được lưu trong hồ sơ windows hiện tại của bạn. Vì vậy, nếu bạn, giống như tôi chạy tác vụ của bạn trong bộ lập lịch trên máy chủ với tư cách là người dùng HỆ THỐNG, điều này sẽ không hoạt động.

Vì vậy, ở đây bạn sẽ phải thay đổi các tập lệnh của mình và thêm đối số -UseBasicParsing, như trong ví dụ này: $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing


7

Bạn có thể vô hiệu hóa nhu cầu chạy cấu hình khởi chạy đầu tiên của Internet Explorer bằng cách chạy tập lệnh PowerShell này, nó sẽ điều chỉnh thuộc tính đăng ký tương ứng:

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

Sau đó, WebClient sẽ hoạt động mà không gặp sự cố


Thật không may, điều này chỉ hoạt động tốt trên các phiên bản GUI nhưng không hoạt động trên Windows Server Core.
Luke

1
@Luke okay, tôi sẽ cố gắng để khám phá giải pháp dành cho Windows Server Core
ujeenator

1

Tôi cũng đã gặp vấn đề này và trong khi -UseBasicParsing sẽ hoạt động đối với một số người, nếu bạn thực sự cần tương tác với dom, nó sẽ không hoạt động. Hãy thử sử dụng chính sách nhóm aa để ngăn cửa sổ cấu hình ban đầu không bao giờ xuất hiện và powershell sẽ không ngăn bạn nữa. Xem tại đây https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

Chỉ cần vài phút sau khi tôi tìm thấy trang này, khi GP được thiết lập, powershell sẽ cho phép bạn thực hiện.


1

Trong yêu cầu web gọi của bạn, chỉ cần sử dụng tham số -UseBasicParsing

ví dụ: trong tập lệnh của bạn (dòng 2), bạn nên sử dụng:

$rss = Invoke-WebRequest -UseBasicParsing

Theo tài liệu, tham số này là cần thiết trên các hệ thống chưa cài đặt hoặc cấu hình IE.

Sử dụng đối tượng phản hồi cho nội dung HTML mà không cần phân tích cú pháp Mô hình đối tượng tài liệu (DOM). Tham số này là bắt buộc khi Internet Explorer không được cài đặt trên máy tính, chẳng hạn như cài đặt Server Core của hệ điều hành Windows Server.


0

Tuy nhiên, một phương pháp khác để giải quyết: cập nhật sổ đăng ký. Trong trường hợp của tôi, tôi không thể thay đổi GPO và -UseBasicParsing phá vỡ các phần của quyền truy cập vào trang web. Ngoài ra, tôi có một người dùng dịch vụ không có quyền đăng nhập, vì vậy tôi không thể đăng nhập với tư cách người dùng và chạy GUI.
Sửa chữa,

  1. đăng nhập như một người dùng bình thường, chạy thiết lập IE.
  2. Sau đó xuất khóa đăng ký này: HKEY_USERS \ S-1-5-21 -.... \ SOFTWARE \ Microsoft \ Internet Explorer
  3. Trong tệp .reg được lưu, thay thế sid của người dùng bằng sid của tài khoản dịch vụ
  4. Nhập tệp .reg

Trong tập tin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.