Czy można pobrać za pomocą wiersza polecenia systemu Windows?


123

Czy bez korzystania z niestandardowych narzędzi (w zestawie z systemem Windows) można pobierać za pomocą wiersza polecenia systemu Windows?

Preferowaną wersją jest Windows XP, ale interesująca jest także nowsza wersja.

Aby wyjaśnić moje pytanie:

  • Musi używać HTTP
  • Plik musi zostać zapisany
  • Standardowa czysta instalacja systemu Windows, bez dodatkowych narzędzi

Zasadniczo, ponieważ wszyscy krzyczą Wget , chcę prostej funkcjonalności Wget, bez korzystania z Wget.


6
Więcej pomysłów w „Jeśli jedyna przeglądarka w systemie Windows nie działa, jak połączyć się z Internetem?” na superuser.com/questions/50427/…
Arjan

A która z kilkunastu wersji Windows XP to byłaby?
Arjan

Powiedzmy, że może to być dowolna wersja systemu Windows XP SP2 i wszystko wydane później.
Robert Massa

@arjan Interesujące pytanie, ale wciąż nie ma ostatecznej odpowiedzi.
Robert Massa

Powinienem był poprosić o „edycję”. Jak Starter, Home, Professional, Media Center, Tablet, może nawet Embedded (chyba dobra zmiana na narzędzia tam!) ... Lub wersje europejskie bez Windows Media Playera. :-)
Arjan

Odpowiedzi:


51

Możesz napisać VBScript i uruchomić go z wiersza poleceń

Utwórz plik downloadfile.vbsi wstaw następujące wiersze kodu:

' Set your settings
    strFileURL = "http://www.it1.net/images/it1_logo2.jpg"
    strHDLocation = "c:\logo.jpg"

' Fetch the file
    Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")

    objXMLHTTP.open "GET", strFileURL, false
    objXMLHTTP.send()

If objXMLHTTP.Status = 200 Then
Set objADOStream = CreateObject("ADODB.Stream")
objADOStream.Open
objADOStream.Type = 1 'adTypeBinary

objADOStream.Write objXMLHTTP.ResponseBody
objADOStream.Position = 0    'Set the stream position to the start

Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocation
Set objFSO = Nothing

objADOStream.SaveToFile strHDLocation
objADOStream.Close
Set objADOStream = Nothing
End if

Set objXMLHTTP = Nothing

Uruchom go z wiersza poleceń w następujący sposób:

cscript.exe downloadfile.vbs 

1
Zastanawiam się, czy to zależy od Internet Explorera, ale myślę, że byłaby to dobra odpowiedź na „Jeśli jedyna przeglądarka w Windows nie działa, jak połączyć się z Internetem?” na superuser.com/questions/50427/… :-)
Arjan

to jest dozwolone, jeśli zezwolenie na cscript.exe jest dozwolone
hello_there_andy

Mogę potwierdzić, że przetestowałem ten skrypt w Windows PE 5.1 i zadziałał jak urok. Zamierzam użyć go do wdrożenia offline, aby sprawdzić wersję platformy na dysku USB z plikiem tekstowym zapisanym na serwerze.
Wędrowiec

74

Począwszy od systemu Windows 7, uważam, że jest jedna metoda, o której jeszcze nie wspomniano, to łatwe:

Składnia:

bitsadmin / transfer nazwa_zadania        / download / priorytetowy priorytet    URL   local \ path \ file

Przykład:

bitsadmin / transfer mydownloadjob / download / priorytet normal ^
                  http://example.com/nazwa_pliku.zip C: \ Users \ nazwa_użytkownika \ Downloads \ nazwa_pliku.zip

(Podzielony na dwie osobne linie ^dla zapewnienia czytelności (aby uniknąć przewijania).)

Ostrzeżenie: jak wskazano w komentarzach, bitsadminkomunikat pomocy zaczyna się od powiedzenia:

BITSAdmin is deprecated and is not guaranteed to be available in future versions of Windows.
Administrative tools for the BITS service are now provided by BITS PowerShell cmdlets.

... ale inny komentarz podał, że działa w systemie Windows 8.


16
jest częścią Windows7.
akira

3
nie działał na moich Windows 7 ...
JYZ

3
To powinna była być najczęściej głosowana odpowiedź. bitsadmin jest przestarzałe na rzecz Windows PowerShell.
lenkite

3
Potwierdź pracę nad Win7
kaiser

7
Uwaga: BITSAdmin jest przestarzały i nie ma gwarancji, że będzie dostępny w przyszłych wersjach systemu Windows. Narzędzia administracyjne dla usługi BITS są teraz dostarczane przez cmdlety BITS PowerShell.
Ujjwal Singh

39

Windows 7 zawiera PowerShell i prawie nic nie można zrobić z PowerShell.

Natywna alternatywa dla wget w Windows PowerShell?


16
(New-Object Net.WebClient) .DownloadFile ('someurl', 'somepath')
Jason Stangroome

3
Powershell jest dla Powerrangers ! Jak to jest kool i dlaczego, do cholery, nie wiedziałem o tym? Do widzenia cmd.
kaiser,

16
z cmd.exe: powershell -command "& { iwr http://www.it1.net/it1_logo2.jpg -OutFile logo.jpg }". działa również z wiersza polecenia
Janus Troelsen

1
Tak, nic nie można zrobić bez PowerShell. To prawdziwa Turing Tarpit :)
jcarpenter2

@JanusTroelsen moja wersja PowerShell odpowiedziała: „Termin„ iwr ”nie jest rozpoznawany jako nazwa polecenia cmdlet ...”, ale po pewnym dochodzeniu to podobne działanie:powershell -command "$clnt = new-object System.Net.WebClient; $clnt.DownloadFile(\"https://host/name\", \"outpufilename\")"
rogerdpack

25

Program PowerShell (dołączony do systemu Windows 8 i dołączony do platformy .NET we wcześniejszych wersjach) ma tę funkcję. powershellKomenda pozwala na uruchomienie dowolnych poleceń PowerShell z wiersza polecenia lub .batpliku. Zatem potrzebna jest następująca linia:

powershell -command "& { (New-Object Net.WebClient).DownloadFile('http://example.com/', 'c:\somefile') }"

2
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post .
harrymc

3
@harrymc na pewno to odpowiedź. pobiera plik. czego jeszcze chcesz?
Janus Troelsen

1
(1) Trochę tekstu wyjaśniającego, na czym polega ta linijka, (2) Sprawdź, czy twoja odpowiedź nie jest alternatywnym sformułowaniem w stosunku do poprzedniej odpowiedzi, ponieważ jeśli tak, to co najwyżej powinna być wyrażona jako komentarz do tej odpowiedzi.
harrymc

Jaka wersja Windows i PowerShell jest wymagana, aby to działało?
Peter Mortensen

2
to nie działa w FYI systemu Windows Server 2012, zgłasza wyjątek MethodInvocationException
knocte

17

Znalazłem sposób na zrobienie tego, ale tak naprawdę po prostu zainstaluj Wget .

Możesz użyć Internet Explorera z wiersza poleceń (iexplore.exe), a następnie wprowadzić adres URL jako argument. Więc uruchom:

iexplore.exe http://blah.com/filename.zip

Cokolwiek to jest plik, musisz określić, że nie będzie wymagało wcześniejszego potwierdzenia. I oto, automatycznie wykona pobieranie. Tak, to technicznie możliwe, ale dobry Boże, rób to inaczej.


Wiem, że wget jest znacznie lepszym sposobem, to tylko hipotetyczne pytanie;) Twoja odpowiedź jest dość bliska, ale nadal wymaga interwencji użytkownika (kliknięcie „Zapisz” lub skonfigurowanie, aby nie wyświetlać tego okna dialogowego)
Robert Massa

3
Jak powiedziałem, musisz odznaczyć opcję monitowania o zapisanie dla tego typu pliku. Na przykład pobierz plik zip, wyłącz ten monit, a następnie w przyszłości wszystkie pliki zip dostępne z wiersza poleceń zostaną automatycznie zapisane.
DHayes

1
+1, chociaż nie sprawdziłem, czy to działa (ale końcowe stwierdzenie jest bardzo prawdziwe)
Arjan

1
+1 za „drogi panie, nie rób tego w ten sposób” ... :)
quack quixote

12

Eksplorator Windows (nie mylić z Internet Explorerem) może pobierać pliki przez HTTP. Wystarczy wpisać adres URL w pasku adresu. Lub z wiersza poleceń, na przykład C:\windows\explorer.exe http://somewhere.com/filename.ext.

Pojawia się klasyczny monit o pobranie pliku . Chyba że plik jest typem, który Eksplorator Windows wie, jak wyświetlać w tekście (.html, .jpg, .gif), w takim przypadku należy kliknąć prawym przyciskiem myszy, aby go zapisać.

Właśnie przetestowałem to na moim obrazie VMware dziewiczej instalacji systemu Windows XP 2002 z dodatkiem SP1 i działa dobrze.


4
wymaga to interakcji użytkownika. prawdopodobnie nie to, czego chce większość ludzi, którzy chcą pobrać plik z wiersza polecenia
Kip

Obecnie zależy to od domyślnej przeglądarki. Mój jest chromowany i automatycznie pobiera się do znanej lokalizacji, więc uważam to rozwiązanie za wystarczające dla moich potrzeb. Dzięki!
kayleeFrye_onDeck

7

Możesz użyć (w standardowym nietoperzu Windows):

powershell -command "& { iwr http://www.it1.net/it1_logo2.jpg -OutFile logo.jpg }"

Wydaje się, że wymaga PowerShell v4 ...

(Dzięki temu komentarzowi i temu )


6

Użyj FTP.

Z wiersza poleceń:

ftp ftp.somesite.com
user
password

itp. FTP jest zawarty w każdej wersji Windows, którą pamiętam; prawdopodobnie nie w 3.1, może nie w Windows 95 , ale na pewno wszystko potem.

@RM: Będzie ciężko, jeśli nie będziesz chciał pobierać żadnych innych narzędzi. Istnieje linia poleceń Wget dla Windows, a Wget jest przeznaczony do robienia dokładnie tego, o co prosisz.


+1 dobra odpowiedź. ftp jest dość uniwersalny, o ile serwer, z którego próbujesz pobrać, obsługuje go.
DaveParillo

Dziękuję, przepraszam, że nie byłem bardziej szczegółowy, miałem na myśli użycie HTTP.
Robert Massa

1
To nie będzie działać z większością serwerów FTP, ponieważ tryb pasywny nie jest obsługiwany przez tego klienta ftp dla Windows (z NAT pomiędzy pomiędzy trybem pasywnym jest wymagany).
Peter Mortensen,

@PeterMortensen To również nie zdalnie odpowiada na pytanie, ponieważ edytował je, aby określić, że szuka funkcjonalności wget. Ale nie pozwól, aby powstrzymało cię to od wskrzeszenia 7-letniej błędnej odpowiedzi, aby dodać trochę pedanterii.
Satanicpuppy

4

Użyj programu PowerShell w następujący sposób:

  1. Utwórz plik download.ps1:

    param($url, $filename)
    $client = new-object System.Net.WebClient 
    $client.DownloadFile( $url, $filename)
    
  2. Teraz możesz pobrać taki plik:

    powershell Set-ExecutionPolicy Unrestricted
    powershell -ExecutionPolicy RemoteSigned -File "download.ps1" "http://somewhere.com/filename.ext" "d:\filename.ext"
    

Działa to nawet w Windows XP 64-bit, PowerShell 2.0.
Peter Mortensen,

1

Jeśli zainstalujesz Telnet, wyobrażam sobie, że możesz wysłać żądanie HTTP do serwera w celu pobrania pliku.

Możesz także zainstalować Cygwin i użyć wget również do pobrania pliku. Jest to bardzo łatwy sposób pobierania plików z wiersza poleceń.


2
Jestem całkiem pewien, że „cygwin” liczy się jako niestandardowe narzędzie ;-)
DaveParillo

Telnet jest interesującą opcją, czy istnieje sposób na przesłanie danych wyjściowych do pliku bez uszkadzania go? Czy możemy przesłać polecenie HTTP GET do telnetu, aby wysłać żądanie?
Robert Massa

Zainstalować telnet? Telnet jest jak ftp; pochodzi z Windows. Nie wiem jednak o przekierowaniu wyjścia.
Satanicpuppy

W przypadku XP (jak w pytaniu) telnet jest instalowany domyślnie, ale słyszałem, że w systemie Vista już tak nie jest? Ale nie, nie zezwala na pobieranie plików, chyba że wszystko zostanie zwrócone w pojedynczej odpowiedzi HTTP, a także można usunąć nagłówki i zdekodować zawartość w wierszu polecenia. Całkiem mało prawdopodobne, że można to kontrolować.
Arjan

1
Po co instalować cygwin tylko po to, aby używać wget? Dostępny jest natywny plik binarny win32.
innaM

1

Istnieje kilka sposobów pobierania za pomocą wiersza polecenia w systemie Windows:

  1. Możesz użyć Cygwin .

    Uwaga: dołączone aplikacje nie są natywnymi aplikacjami systemu Linux. Jeśli chcesz uruchomić system Windows, musisz odbudować aplikację ze źródła.

  2. Korzystając z usługi telnet, można złożyć żądanie, ale przetwarzanie nie będzie widoczne.

  3. Możesz pisać skrypty bat lub VBS.

  4. Napisz własny program, który można uruchomić z cmd.exe.


1

Możesz zainstalować aplikację Linux Wget w systemie Windows. Można go pobrać ze strony http://gnuwin32.sourceforge.net/packages/wget.htm . Następnie możesz wydać polecenie „wget (inserturlhere)” lub dowolny inny adres URL w wierszu polecenia, co pozwoli ci pobrać ten adres URL / plik / obraz.


1
O dziwo ta wersja nie zawsze jest kompatybilna. Na moim komputerze z systemem Windows 7 nie było tak dlatego, że brakowało bibliotek. W większości przypadków chciałbyś używać wget bez żadnych dodatkowych bibliotek. users.ugent.be/~bpuype/wget
sinni800


0

W domyślnym systemie Windows nie można pobierać przez HTTP. Windows jest systemem operacyjnym zorientowanym na GUI, więc brakuje mu wielu narzędzi wiersza poleceń, które można znaleźć w innych systemach operacyjnych, na przykład wget, które byłyby głównym kandydatem.

System.Net.WebClient.DownloadFile(), funkcja w WiniNetinterfejsie API, może pobierać pliki, ale nie jestem pewien, jak daleko się posuwasz w porównaniu do pliku wsadowego.


Rozumiem, że jest to możliwe przy użyciu wget, ale moje pytanie brzmi bez użycia niestandardowych narzędzi systemu Windows.
Robert Massa

0

Jeśli masz zainstalowany Python, oto przykład, który pobiera plik get-pip.py z sieci

python -c "import urllib; urllib.urlretrieve ('https://bootstrap.pypa.io/get-pip.py', r'C:\python27\Tools\get-pip.py')"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.