Batch Script sử dụng Powershell để tải xuống từ web


3

Do phần lớn công việc của tôi được thực hiện từ xa, tôi có một tập lệnh bó tải tất cả các công cụ của tôi từ máy chủ FTP của tôi sang PC của khách hàng. Tôi chỉ sao chép và dán văn bản vào notepad trên PC của khách hàng và lưu nó dưới dạng một đợt và chạy nó.

Điều này hoạt động rất tốt, nhưng vấn đề là, các chương trình tôi sử dụng được cập nhật thường xuyên - vì vậy tôi sẽ tải xuống các phiên bản cũ. Bằng cách nghiên cứu một chút, tôi thấy rằng PowerShell có thể tải xuống các tệp trực tiếp từ web.

Tải xuống tệp qua HTTP từ tập lệnh trong Windows

Làm thế nào để thực thi các lệnh powershell từ một tệp bó?

Có vẻ như tất cả các phần đều ở đó, nhưng tôi không biết gì về PowerShell cả và tôi là một người nghiệp dư hoàn toàn. Hơn nữa, tôi đoán bạn không thể gọi PowerShell trong tập lệnh bó và bắt đầu viết bằng PowerShell.

Vì vậy, đây là mục tiêu cuối cùng; Để viết một tập lệnh bó sử dụng powershell để tải xuống các tệp từ các trang web khác nhau (tôi sẽ cung cấp URL). Thay vì tải xuống các tệp từ máy chủ FTP của tôi, tập lệnh sẽ tải xuống các chương trình ngay từ nguồn.

Cảm ơn trước.


Thử nghiệm Invoke-WebRequestvới PowerShell. Xem docs.microsoft.com/en-us/powershell/module/...
Pimp Juice CNTT

1
Cân nhắc sử dụng chocolatey
LotPings


Cảm ơn bạn rất nhiều vì đã dành thời gian. McDonald, tôi không chắc nếu điều này trả lời câu hỏi của tôi. Như đã chỉ ra, tôi đã xem qua các lệnh này trước khi đăng và đồng ý rằng PowerShell có thể giúp đỡ. Khi tôi điều khiển từ xa vào PC của khách hàng, tôi sao chép và dán văn bản tập lệnh bó của mình vào notepad trên PC của khách hàng. Chạy nó tải các công cụ của tôi từ máy chủ FTP của tôi xuống PC của khách hàng. Tôi sẽ cần một cái gì đó tương tự dễ thực hiện để tải xuống các tệp này từ trang web của họ. Tôi nghĩ mục tiêu cuối cùng sẽ là viết một tập lệnh bó sử dụng PowerShell để tải xuống các tệp từ nhiều trang web.
Christopher Moore

Liên quan đến các liên kết được cung cấp bởi TẤT CẢ, tôi đã xem từng bài viết đó. Tôi đã xem qua Wget trước khi đăng. Vào thời điểm đó, tôi gặp khó khăn trong việc hiểu làm thế nào để thực hiện nó theo cách mà sẽ dẫn đến mục tiêu cuối cùng đã nói ở trên. Theo những gì tôi hiểu về Wget, tôi nghĩ nó cũng cần được cài đặt trên máy tính của khách hàng. Tôi đang cố gắng để giảm thiểu các bước. Ngay bây giờ tôi chỉ cần cắt, dán, chạy. Tôi cũng không muốn cài đặt các chương trình trên máy của khách hàng mà họ không yêu cầu. Tôi cảm thấy nhiệm vụ có thể được thực hiện theo cách dễ dàng hơn, trực tiếp hơn nhiều.
Christopher Moore

Câu trả lời:


2

Phương thức này sử dụng PowerShell phiên bản 2 trở đi tương thích và sử dụng lớp System.Net.WebClient.

Tạo một mảng sau đó thêm URL cần thiết vào mảng. Chỉ định vị trí tải xuống của bạn, sau đó cho từng mục trong mảng của bạn, tạo một tên tệp mà tham số tệp System.Net.WebClient yêu cầu bằng cách sử dụng Toán tử PowerShell -Split cho chuỗi từ lần xuất hiện cuối cùng của dấu gạch chéo chuyển tiếp.

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

Hoặc sử dụng Invoke-WebRequest theo nhận xét của @ McDonald hoặc wget bí danh Invoke-WebRequest, cả hai đều có sẵn từ PowerShell phiên bản 3 trở đi nhưng có thể chậm hơn

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

Lưu tập lệnh dưới dạng "C: \ Path \ to \ download_script.ps1"

tạo và chạy tệp .bat với nội dung

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

hoặc chạy tệp .ps1 từ PowerShell

EDIT Để phù hợp với nhận xét của bạn vào câu trả lời của tôi, bạn có thể thay đổi mảng thành một mảng nhiều cột và gọi tiêu đề mục là a. thuộc tính

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

Cảm ơn bạn rất nhiều vì tất cả thời gian và nỗ lực của bạn! Bây giờ chỉ xảy ra với bộ não thiếu ngủ của tôi mà tôi chỉ có thể sao chép và dán nó vào PowerShell trên PC của khách hàng. Không cần cho đợt. Tha thứ cho sự thiếu hiểu biết của tôi, nhưng có cách nào để tôi chọn tên tệp đã lưu không?
Christopher Moore

@Christopher Moore xem chỉnh sửa nơi bạn có thể thay đổi tên tệp và đường dẫn tải xuống
Antony

1

Dưới đây là một ví dụ mà tôi đã thực hiện để bạn tải xuống một số mã hàng loạt từ một tệp có thể được tạo nếu không tồn tại và tất nhiên bạn có thể thêm những gì bạn muốn của url trong tệp này!

Vì vậy, hãy thử và cho tôi biết kết quả về phía bạn!

@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
::*************************************************************************
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.