Script em lote usando o Powershell para fazer download da web

2

Sendo que a maior parte do meu trabalho é feito remotamente, tenho um script em lote que faz o download de todas as minhas ferramentas do meu servidor FTP para o PC do cliente. Acabei de copiar e colar o texto no bloco de notas no PC do cliente e salvá-lo como um lote e executá-lo.

Isso funciona muito bem, mas o problema é que os programas que eu uso são atualizados de tempos em tempos - então eu estaria baixando versões antigas. Ao fazer uma pequena pesquisa, descobri que o PowerShell pode baixar arquivos diretamente da web.

Faça o download de um arquivo via HTTP de um script no Windows

Como executar comandos do powershell a partir de um arquivo de lote?

Parece que todas as peças estão lá, mas eu não sei nada sobre o PowerShell e sou um amador total com lote. Além disso, acho que você não pode simplesmente chamar o PowerShell no script em lote e começar a escrever no PowerShell.

Então aqui está o objetivo final; Para escrever um script em lote que usa powershell para baixar arquivos de sites diferentes (eu forneceria URLs). Em vez de baixar os arquivos do meu servidor FTP, o script baixaria os programas diretamente da fonte.

Muito obrigado antecipadamente.

    
por Christopher Moore 07.08.2017 / 00:14

2 respostas

1

Esse método usa o PowerShell versão 2 em diante compatível e usa a classe System.Net.WebClient.

Cria uma matriz e adiciona URLs obrigatórios à matriz. Especifique seu local de download e, em seguida, para cada item em sua matriz, gere um nome de arquivo que o parâmetro de arquivo System.Net.WebClient requer usando o PowerShell -Split Operator para a sequência da última ocorrência da barra.

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

Como alternativa, use o Invoke-WebRequest como o comentário do @ McDonald ou o apelido Invoke-WebRequest que estão disponíveis na versão 3 do PowerShell , mas podem ser mais lentos

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

Salvar o script como "C: \ Path \ para \ download_script.ps1"

crie e execute o arquivo .bat com o conteúdo

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

ou execute o arquivo .ps1 do PowerShell

EDITAR Para acomodar seu comentário em minha resposta, você pode alterar a matriz em uma matriz de várias colunas e chamar o título do item como a. atributo

$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)
}
    
por 08.08.2017 / 16:40
1

Aqui está um exemplo que eu fiz para você baixar alguns códigos de lote de um arquivo que pode ser criado se não existir, e é claro que você pode adicionar o que você deseja de URLs neste arquivo!

Então, basta tentar e me dizer o resultado do seu lado!

@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
::*************************************************************************
    
por 21.08.2017 / 04:24