Muszę pobrać serię kanału 9 za pomocą PowerShell, jednak skrypty, które wypróbowałem, zawierają błędy:
Ten skrypt
$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 } }
nie powiodło się z błędem:
Nie można przeanalizować treści odpowiedzi, ponieważ silnik programu Internet Explorer jest niedostępny lub konfiguracja pierwszego uruchomienia programu Internet Explorer nie została ukończona. Określ parametr UseBasicParsing i spróbuj ponownie.
Próbowałem też tego
# --- 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
ze zbyt dużą liczbą błędów
powershell
internet-explorer
Luis Valencia
źródło
źródło
Odpowiedzi:
W żądaniu sieciowym invoke użyj po prostu parametru
-UseBasicParsing
np. w swoim skrypcie (linia 2) powinieneś użyć:
$rss = Invoke-WebRequest -Uri $url -UseBasicParsing
Zgodnie z dokumentacją ten parametr jest niezbędny w systemach, w których IE nie jest zainstalowany ani skonfigurowany:
źródło
UseBasicParsing
się robi: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.
skopiowano stąd: docs.microsoft.com/de-de/powershell/module/ ...Aby to działało bez modyfikowania skryptów:
Znalazłem rozwiązanie tutaj: http://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/
Błąd prawdopodobnie się pojawia, ponieważ IE nie został jeszcze uruchomiony po raz pierwszy, wyświetlając poniższe okno. Uruchom go i przejdź przez ten ekran, a wtedy komunikat o błędzie już się nie pojawi. Nie ma potrzeby modyfikowania żadnych skryptów.
źródło
Jest to pewne, ponieważ polecenie Invoke-WebRequest ma zależność od zestawów programu Internet Explorer i wywołuje je w celu przeanalizowania wyniku zgodnie z domyślnym zachowaniem. Jak sugeruje Matt, możesz po prostu uruchomić IE i dokonać wyboru w oknie ustawień, które pojawia się przy pierwszym uruchomieniu. A błąd, którego doświadczasz, zniknie.
Jest to jednak możliwe tylko wtedy, gdy uruchamiasz skrypty PowerShell jako ten sam użytkownik systemu Windows, z którym uruchomiłeś IE. Ustawienia IE są przechowywane w bieżącym profilu systemu Windows. Więc jeśli Ty, tak jak ja, uruchamiasz swoje zadanie w harmonogramie na serwerze jako użytkownik SYSTEM, to nie zadziała.
Więc tutaj będziesz musiał zmienić swoje skrypty i dodać argument -UseBasicParsing, tak jak w tym przykładzie:
$WebResponse = Invoke-WebRequest -Uri $url -TimeoutSec 1800 -ErrorAction:Stop -Method:Post -Headers $headers -UseBasicParsing
źródło
Możesz wyłączyć potrzebę uruchamiania konfiguracji pierwszego uruchomienia programu Internet Explorer, uruchamiając ten skrypt PowerShell, dostosuje on odpowiednią właściwość rejestru:
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Internet Explorer\Main" -Name "DisableFirstRunCustomize" -Value 2
Po tym WebClient będzie działał bez problemów
źródło
Miałem również ten problem i chociaż -UseBasicParsing będzie działać dla niektórych, jeśli faktycznie potrzebujesz interakcji z domem, to nie zadziała. Spróbuj użyć zasad grupy, aby zatrzymać pojawianie się początkowego okna konfiguracji, a program PowerShell już Cię nie powstrzyma. Zobacz tutaj https://wahlnetwork.com/2015/11/17/solving-the-first-launch-configuration-error-with-powershells-invoke-webrequest-cmdlet/
Zajęło mi to tylko kilka minut, gdy znalazłem tę stronę, po ustawieniu GP, PowerShell pozwoli ci przejść.
źródło
W wywołaniu żądania internetowego wystarczy użyć parametru -UseBasicParsing
np. w swoim skrypcie (linia 2) powinieneś użyć:
$rss = Invoke-WebRequest -UseBasicParsing
Zgodnie z dokumentacją parametr ten jest niezbędny w systemach, w których IE nie jest zainstalowany ani skonfigurowany.
Używa obiektu odpowiedzi dla treści HTML bez analizowania modelu obiektu dokumentu (DOM). Ten parametr jest wymagany, jeśli program Internet Explorer nie jest zainstalowany na komputerach, na przykład w przypadku instalacji Server Core systemu operacyjnego Windows Server.
źródło
Jeszcze inna metoda rozwiązania: aktualizacja rejestru. W moim przypadku nie mogłem zmienić GPO, a -UseBasicParsing przerywa części dostępu do strony internetowej. Miałem również użytkownika usługi bez uprawnień do logowania, więc nie mogłem zalogować się jako użytkownik i uruchomić GUI.
Naprawić,
W pliku
źródło