Internet Explorer 엔진을 사용할 수 없기 때문에 응답 콘텐츠를 구문 분석 할 수 없습니다.


111

powershell을 사용하여 채널 9 시리즈를 다운로드해야하지만 시도한 스크립트에 오류가 있습니다.

  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

42
공정하게 말하면 오류 메시지에서 "Internet Explorer"라는 단어를보고 나머지 메시지는 무시하기 쉽습니다. 명령 줄 유틸리티가 IE에 의존하는 이유에 대해 맹렬한 반응을 보일 때입니다.
MisterZimbu 2017-06-20

답변:


224

웹 요청 호출에서 매개 변수를 사용하십시오. -UseBasicParsing

예를 들어 스크립트 (라인 2)에서 다음을 사용해야합니다.

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

설명서 에 따르면 이 매개 변수는 IE가 설치 또는 구성되지 않은 시스템에 필요합니다.

DOM (문서 개체 모델) 구문 분석없이 HTML 콘텐츠에 대한 응답 개체를 사용합니다. 이 매개 변수는 Windows Server 운영 체제의 Server Core 설치와 같이 컴퓨터에 Internet Explorer가 설치되지 않은 경우에 필요합니다.


17
무엇에 관심이 미래의 방문객 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/...
브루노 Bieri에게

이 서버에 Internet Explorer가 설치되어 있고 설정되어 있습니다. 그리고 여전히 -UseBasicParsing이 필요합니다. 이유가 확실하지 않습니다.
Don Rolling

39

스크립트를 수정하지 않고 작동하게하려면 :

여기에서 해결책을 찾았습니다. http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/

IE가 아직 처음으로 시작되지 않았기 때문에 오류가 발생했을 수 있으며 아래 창이 나타납니다. 그것을 시작하고 해당 화면을 통과하면 오류 메시지가 더 이상 나타나지 않습니다. 스크립트를 수정할 필요가 없습니다.

즉 첫 번째 실행 창


PowerShell을 사용하기위한 자동화 된 프로세스를 위해 Server 2008 서버에서 Server 2012 R2로 모든 스크립트를 업데이트 할 필요없이 저를 위해 일했습니다. 이것은 특정 계정을 사용했기 때문에 실제로 서버에 서명 된 해당 계정으로 이것을 실행해야했습니다.
Bitcoin Murderous Maniac

12
이렇게하면 오류가 제거되지만 PowerShell이 ​​자동화 플랫폼으로 사용된다는 점을 감안할 때 GUI를 통해 문제를 해결해야하는 필요성은 허용되는 대답이 아닙니다. 이 답변은 예를 들어 PowerShell 원격 세션 내의 모든 시나리오에서 작동하지 않습니다.
Devon Dieffenbach

2
GPO (그룹 정책 개체)를 사용하여 첫 번째 실행 마법사를 처리합니다 . 컴퓨터 구성> 정책> 관리 템플릿> Windows 구성 요소> Internet Explorer. 옵션을 사용하여 "방지가 실행 처음 실행 마법사" "정책을 설정하고 선택하는 정장 당신.
techie007

kubectly 프록시 에서이 문제가 발생했으며 curl을 사용할 때 수정되었습니다. 감사!
gpbaculio

이 시나리오는 자동 확장 그룹의 내부에 앱이있는 경우에도 작동하지 않습니다. 새 인스턴스가 가동 될 때 매일 / 매주 등이 필요하기 때문입니다. -UseBasicParsing을 사용하는 것이 가장 좋습니다
Ryan C

10

Invoke-WebRequest 명령은 Internet Explorer 어셈블리에 대한 종속성이 있고 기본 동작에 따라 결과를 구문 분석하기 위해 호출하기 때문입니다. Matt가 제안한 것처럼 간단히 IE를 시작하고 처음 시작할 때 나타나는 설정 프롬프트에서 선택할 수 있습니다. 그리고 경험하는 오류는 사라질 것입니다.

그러나 이것은 IE를 시작한 동일한 Windows 사용자로 powershell 스크립트를 실행하는 경우에만 가능합니다. IE 설정은 현재 Windows 프로필에 저장됩니다. 따라서 나처럼 SYSTEM 사용자로 서버의 스케줄러에서 작업을 실행하면 작동하지 않습니다.

따라서 여기에서 스크립트를 변경하고 -UseBasicParsing 인수를 추가해야합니다. $WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing


7

이 PowerShell 스크립트를 실행하여 Internet Explorer의 첫 번째 시작 구성을 실행하지 않도록 설정할 수 있으며 해당 레지스트리 속성을 조정합니다.

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

그 후 WebClient는 문제없이 작동합니다.


불행히도 이것은 GUI 버전에서만 잘 작동하지만 Windows Server Core에서는 작동하지 않습니다.
누가 복음

1
좋아 @Luke, 나는 윈도우 서버 코어에 대한 해결책을 발견하려고합니다
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가 설치되거나 구성되지 않은 시스템에서 필요합니다.

DOM (문서 개체 모델) 구문 분석없이 HTML 콘텐츠에 대한 응답 개체를 사용합니다. 이 매개 변수는 Windows Server 운영 체제의 Server Core 설치와 같이 컴퓨터에 Internet Explorer가 설치되지 않은 경우에 필요합니다.


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.