Skrypt wsadowy wykorzystujący Powershell do pobrania z sieci

2

Ponieważ większość mojej pracy jest wykonywana zdalnie, mam skrypt wsadowy, który pobiera wszystkie moje narzędzia z mojego serwera FTP na komputer klienta. Wystarczy skopiować i wkleić tekst do notatnika na komputerze klienta i zapisać go jako partię i uruchomić.

To działa świetnie, ale problem polega na tym, że programy, z których korzystam, są aktualizowane co jakiś czas - więc pobierałbym stare wersje. Przeprowadzając małe badania, odkryłem, że PowerShell może pobierać pliki bezpośrednio z sieci.

Pobierz plik za pomocą protokołu HTTP ze skryptu w systemie Windows

Jak wykonywać polecenia PowerShell z pliku wsadowego?

Wygląda na to, że wszystkie utwory są tam, ale w ogóle nic nie wiem o PowerShell i jestem kompletnym amatorem w partii. Co więcej, chyba nie możesz po prostu wywołać PowerShell w skrypcie wsadowym i zacząć pisać w PowerShell.

Oto cel końcowy; Aby napisać skrypt wsadowy, który używa PowerShell do pobierania plików z różnych stron internetowych (podałbym adresy URL). Zamiast pobierać pliki z mojego serwera FTP, skrypt pobierze programy bezpośrednio ze źródła.

Z góry bardzo dziękuję.

Christopher Moore
źródło
Przetestuj z Invoke-WebRequest z PowerShell. Widzieć docs.microsoft.com/en-us/powershell/module/…
Pimp Juice IT
1
Rozważ użycie czekoladowy
LotPings
Dziękuję bardzo za poświęcenie czasu. McDonald's, nie jestem pewien, czy to odpowiada na moje pytanie. Jak wskazałem, przejrzałem te polecenia przed wysłaniem i zgadzam się, że PowerShell może pomóc. Kiedy zdalnie podłączam się do komputera klienta, kopiuję i wklejam tekst skryptu wsadowego do notatnika na komputerze klienta. Uruchomienie go pobiera moje narzędzia z mojego serwera FTP na komputer klienta. Potrzebowałbym czegoś równie łatwego do zaimplementowania, który zamiast tego pobierałby te pliki ze swoich stron internetowych. Myślę, że celem końcowym byłoby napisanie skryptu wsadowego, który używa PowerShell do pobierania plików z wielu stron internetowych.
Christopher Moore
W odniesieniu do linków udostępnianych przez TOOGAM widziałem już każdy z tych artykułów. Spojrzałem na Wget przed wysłaniem. W tym czasie miałem problem ze zrozumieniem, jak go wdrożyć w taki sposób, aby uzyskać wspomniany cel końcowy. W tym, co rozumiem o Wget, myślę, że również musi być zainstalowany na komputerze klienta. Próbuję zminimalizować kroki. W tej chwili po prostu wycinam, wklejam, biegam. Nie chciałbym także instalować programów na komputerach klienckich, o które nie prosili. Uważam, że zadanie można wykonać w znacznie łatwiejszy, bardziej bezpośredni sposób.
Christopher Moore

Odpowiedzi:

1

Ta metoda używa Wersja 2 programu PowerShell zgodny i używa klasy System.Net.WebClient.

Tworzy tablicę, a następnie dodaje wymagane adresy URL do tablicy. Określ lokalizację pobierania, a następnie dla każdej pozycji w tablicy wygeneruj nazwę pliku, której wymaga parametr pliku System.Net.WebClient, używając operatora PowerShell -Split dla ciągu od ostatniego wystąpienia ukośnika.

$Urls = @()
$Urls += "https://your/first/download/path/.ext"
$Urls += "https://your/next/download/path/.ext"

$OutPath = "C:\Path\to\download\"

ForEach ( $item in $Urls) {
$file = $OutPath +  ($item).split('/')[-1]
(New-Object System.Net.WebClient).DownloadFile($item, $file)
}

Alternatywnie użyj Invoke-WebRequest jako komentarza @ McDonald's lub aliasu wget Invoke-WebRequest, które są dostępne z PowerShell wersja 3 dalej, ale może być wolniejszy

$Urls = @()
$Urls += "https://your/first/download/path/.ext"
$Urls += "https://your/next/download/path/.ext"

$OutPath = "C:\Path\to\download\"

ForEach ( $item in $Urls) {
$file = $OutPath +  ($item).split('/')[-1]
Invoke-WebRequest -Uri $i -Outfile $file
}

Zapisz dowolny skrypt jako „C: ścieżka do download_script.ps1”

utwórz i uruchom plik .bat z zawartością

PowerShell -File  "C:\Path\to\download_script.ps1"

lub uruchom plik .ps1 z PowerShell

EDYTOWAĆ Aby dopasować swój komentarz do mojej odpowiedzi, możesz zmienić tablicę na tablicę z wieloma kolumnami i wywołać nagłówek pozycji jako. atrybut

$Urls = @()
$item = "" | Select path,outpath,name
$item.path = "https://your/first/download/path/.ext"
$item.outpath = "C:\Path\to\download\"
$item.name = "Name1.ext"
$Urls = $Urls + $item

$item = "" | Select path,outpath,name
$item.path = "https://your/next/download/path/.ext"
$item.outpath = "C:\Path\to\download\"
$item.name = "Name2.ext"
$Urls = $Urls + $item

ForEach ( $item in $Urls) {
$file = ($item.outpath) + ($item.name)
(New-Object System.Net.WebClient).DownloadFile($item.path, $file)
}
Antony
źródło
Dziękuję bardzo za cały czas i wysiłek! Dopiero teraz mojemu uśpionemu mózgowi brakuje mózgu, że mogę go po prostu skopiować i wkleić do PowerShell na komputerze klienta. Nie ma potrzeby partii. Wybacz mi moją niewiedzę, ale czy jest jakiś sposób na wybranie zapisanej nazwy pliku?
Christopher Moore
@ Christopher Moore zobacz edycję, w której możesz zmienić nazwy plików i ścieżki ładowania w dół
Antony
1

Oto przykład, który zrobiłem, aby pobrać niektóre kody wsadowe z pliku, który można utworzyć, jeśli nie istnieje, i oczywiście możesz dodać to, co chcesz z adresów URL w tym pliku!

Po prostu spróbuj i powiedz mi wynik po swojej stronie!

@echo off
Mode 110,3 & color 0A
Title Download file from web using powershell and batch by Hackoo 2017
Set "List_Urls_File=Urls.txt"
If not exist "%List_Urls_File%" Call :Create_Urls_File
Setlocal enabledelayedexpansion
@For /f "delims=" %%a in ('Type "%List_Urls_File%"') do (
    Set "URL=%%a"
    Rem we set the Filename from the variable !url!
    @for %%# in (!url!) do ( set "File=%%~xn#" )
    Rem Check if the file name contains a dot "." 
    Rem If not we increment the counter +1 for file to be download
        ECHO !File! | FIND /I ".">Nul 2>&1
        If "!errorlevel!" NEQ "0" (
            Set /a Count+=1
            cls & echo(
            echo               Downloading file "File-!Count!.bat" from URL : "!URL!"
            Call :BalloonTip 'information' 10 '"Downloading File-!Count!.bat"' "'Please wait... Downloading File-!Count!.bat....'" 'info' 4
            Call :Download "%%a" "File-!Count!.bat"
        ) else (
            cls & echo(
            echo    Downloading file "!File!" from URL : "!URL!"
            Call :BalloonTip 'information' 10 '"Downloading !File!"' "'Please wait... Downloading !File!....'" 'info' 4

            Call :Download "%%a" "!File!"
        )
)
Explorer "%~dp0" & exit
::*********************************************************************************
:Download <url> <File>
Powershell.exe -command "(New-Object System.Net.WebClient).DownloadFile('%1','%2')"
exit /b
::*********************************************************************************
:Create_Urls_File
(
    echo https://pastebin.com/raw/XvyhRzT6
    echo https://pastebin.com/raw/QqnZ0MjQ
    echo https://pastebin.com/raw/tHsKw15V
    echo https://pastebin.com/raw/VCnTbLB6
    echo https://pastebin.com/raw/3zUTrWUz
    echo https://pastebin.com/raw/31auQeFz
    echo https://pastebin.com/raw/xF0uXThH
    echo https://pastebin.com/raw/uzsGQD1h
    echo https://pastebin.com/raw/3TmVYiZJ
    echo https://pastebin.com/raw/Ntc8SZLU
    echo https://pastebin.com/raw/jnpRBhwn
    echo https://www.virustotal.com/static/bin/vtuploader2.2.exe
    echo http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe
)>"%List_Urls_File%"
exit /b
::*********************************************************************************
:BalloonTip $notifyicon $time $title $text $icon $Timeout
PowerShell  ^
  [reflection.assembly]::loadwithpartialname('System.Windows.Forms') ^| Out-Null; ^
 [reflection.assembly]::loadwithpartialname('System.Drawing') ^| Out-Null; ^
 $notify = new-object system.windows.forms.notifyicon; ^
  $notify.icon = [System.Drawing.SystemIcons]::%1; ^
  $notify.visible = $true; ^
  $notify.showballoontip(%2,%3,%4,%5); ^
  Start-Sleep -s %6; ^
  $notify.Dispose()
%End PowerShell%
exit /B
::*************************************************************************
Hackoo
źródło