Hochladen und Herunterladen von Dateien mit dem PowerShell-FTP-Skript

Die sicheren Komponenten gibt es schon lange. FTP verschiebt Dateien von einem Ort zu einem anderen, entweder in einem lokalen Netzwerk oder über das Internet.

PowerShell scheint nicht verwandt zu sein und ist allgemein verbreitet Skriptsprache Das ist in der Lage, viele Sysadmin-Aufgaben zu automatisieren.

Aber was passiert, wenn Sie sie zusammenbringen? Sie erhalten ein Rezept für eine leistungsstarke und kostenlos Automatisierungstool mit der allgegenwärtigen Natur, unter vielen verschiedenen Umständen verwendet zu werden. Administratoren können mithilfe von PowerShell und den .NET-Klassen einige leistungsstarke FTP-Skripts erstellen.

In diesem Artikel erfahren Sie, wie Sie die Leistung von PowerShell mit FTP kombinieren, um PowerShell-Skripts zum Übertragen von Dateien von IP-Adresse zu IP-Adresse, Quellstammordner zum Zielserver und mehr zu erstellen.

Erstellen eines einfachen FTP-Skripts

Beginnen wir mit einem einfachen PowerShell-FTP-Skript: Übertragen einer einzelnen Datei von einem System auf ein anderes mit einfacher Benutzer- / Kennwortauthentifizierung.
1. Erstellen Sie das Skript

  • Öffne deinen bevorzugten PowerShell-Skripteditor und speichere ein PS1-Skript mit dem Namen Upload-File.ps1. Dieses Skript enthält den gesamten Code, den Sie zum Hochladen einer Datei über FTP benötigen.
  • Erstellen Sie einige Parameter für das Skript. Da PowerShell-Skripte Tools sind, ist es wichtig, dies zu können Verwenden Sie dieses Skript erneut für andere Situationen. Unten sehen Sie drei Parameter, an die Sie den Benutzernamen / das Kennwort über ein PSCredential-Objekt, den lokalen Dateipfad und den Hostnamen des FTP-Servers übergeben können, an den die Datei gesendet werden soll.
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [pscredential]$Credential,    [Parameter(Mandatory)]
    [string]$FilePath,     [Parameter(Mandatory)]
    [string]$FtpServerHost
)

  • Erstellen Sie ein .NET WebClient-Objekt. Dieses Objekt verfügt über Methoden, die sowohl FTP-Übertragungen als auch aufrufen HTTP Geben Sie nach der Definition den Benutzernamen und das Passwort für die Referenzen Eigenschaft, wie unten gezeigt.
$webclient = New-Object System.Net.WebClient

$ftpPassword = $Credential.GetNetworkCredential().Password
$webclient.Credentials = New-Object System.Net.NetworkCredential($Credential.Username, $ftpPassword)

  • Nachdem das WebClient-Objekt erstellt und die Anmeldeinformationen definiert wurden, legen Sie fest, wohin die Datei verschoben werden soll. Dazu müssen Sie ein System.Uri .NET-Objekt erstellen, wie unten gezeigt.
$remoteFileName = $FilePath | Split-Path -Leaf
$uri = New-Object System.Uri("ftp://$FtpServerHost/$remoteFileName")
  • Rufen Sie abschließend die auf Datei hochladen() Methode, die den soeben erstellten URI und den Pfad über das Skript empfangen Der folgende Code lädt die lokale Datei in das Stammverzeichnis des FTP-Servers hoch.
$webclient.UploadFile($uri, $FilePath)
  • Ihr einfaches Skript sollte jetzt so aussehen:
[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [pscredential]$Credential,

    [Parameter(Mandatory)]
    [string]$FilePath,     [Parameter(Mandatory)]
    [string]$FtpServerHost
) $webclient = New-Object System.Net.WebClient $ftpPassword = $Credential.GetNetworkCredential().Password
$webclient.Credentials = New-Object System.Net.NetworkCredential($Credential.Username, $ftpPassword) $remoteFileName = $FilePath | Split-Path -Leaf
$uri = New-Object System.Uri("ftp://$FtpServerHost/$remoteFileName") $webclient.UploadFile($uri, $FilePath) $webclient.Dispose()

2. Führen Sie das Skript aus

  • Um das Skript auszuführen, rufen Sie es auf und übergeben Sie die Werte für jeden Parameter wie unten gezeigt. Der Befehl fordert Sie zur Eingabe eines Benutzernamens und eines Kennworts auf. Es wird dann diesen Benutzernamen und verwenden Passwort zur Authentifizierung auf den FTP-Server ftpserver.domainname.com und übertragen Sie den C: .txt Datei in das Stammverzeichnis des FTP-Servers.
.Upload-File.ps1 -Credential (Get-Credential) -FilePath 'C:Demofile.txt' -FtpServerHost 'ftpserver.domainname.com'

Erstellen eines erweiterten FTP-Skripts

Lassen Sie uns nun dieses einfache Skript weiterentwickeln. Angenommen, Sie möchten eine Datei mit FTPS kopieren, um die Übertragung über das Netzwerk zu verschlüsseln. Dazu müssen Sie ein .NET WebRequest-Objekt verwenden.
Mit einer ähnlichen Technik können Sie die ersetzen Upload-Script.ps1 Skript mit dem folgenden Code. Das Skript dient demselben Zweck und überträgt Dateien unverschlüsselt, bietet jedoch jetzt die Option dazu Dateien sicher übertragen auch.

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [pscredential]$Credential,    [Parameter(Mandatory)]
    [string]$FilePath,     [Parameter(Mandatory)]
    [string]$FtpServerHost,     [Parameter()]
    [switch]$SecureTransfer
) ## Define the FTP URI and credentials to use for connection
$ftpPassword = $Credential.GetNetworkCredential().Password
$remoteFileName = $FilePath | Split-Path -Leaf $request = [Net.WebRequest]::Create("ftp://$FtpServerHost/$remoteFileName")
$request.Credentials = New-Object System.Net.NetworkCredential($Credential.Username, $ftpPassword) ## Only if the $SecureTransfer switch parameter is used, transfer with FTPS
if ($SecureTransfer.IsPresent) {
    $request.EnableSsl = $true
} ## Tell the request object we'll be uploading a file
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile ## Open the local file and conver to a request stream for transferring
$fileStream = [System.IO.File]::OpenRead($FilePath)
$ftpStream = $request.GetRequestStream() ## Transfer the file
$fileStream.CopyTo($ftpStream) ## Clean up the memory used for .NET objects
$ftpStream.Dispose()
$fileStream.Dispose()

Hochladen oder Herunterladen eines gesamten Ordners

Aufbauend auf dem erweitertes Skript oben müssen Sie möglicherweise eine Datei herunterladen. Außerdem müssen Sie übertragen alle Dateien in einem Ordner statt einer einzelnen Datei. Unten finden Sie ein Skript, um genau das zu tun.

Sie finden Kommentare, die weitere Informationen zu den einzelnen Zeilen enthalten.

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [pscredential]$Credential,    [Parameter(Mandatory)]
    [string]$LocalPath,     [Parameter(Mandatory)]
    [string]$FtpServerHost,     [Parameter(Mandatory)]
    [ValidateSet('Download','Upload')]
    [string]$Direction
) $webclient = New-Object System.Net.WebClient $ftpPassword = $Credential.GetNetworkCredential().Password
$webclient.Credentials = New-Object System.Net.NetworkCredential($Credential.Username, $ftpPassword) if ($Direction -eq 'Download') {
    ## Find all files on the FTP server
    $request = [Net.WebRequest]::Create($url)
  $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
    $request.Credentials = $credentials
  $response = $request.GetResponse()
  $reader = New-Object IO.StreamReader $response.GetResponseStream()
    $files = while(-not $reader.EndOfStream) {
        $reader.ReadLine()
  }
  $reader.Close()
  $response.Close()
   
    ## Download each file
    foreach ($file in $files){
        $source = "$uri/$file"
    $destination = "$LocalPath/$file"
    $webclient.DownloadFile($source, $destination)
  }
} elseif ($Direction -eq 'Upload') {
    ## Find all local files and upload them
    Get-ChildItem -Path $LocalPath | ForEach-Object {
        $uri = New-Object System.Uri("ftp://$FtpServerHost/$($_.Name)")
        $webclient.UploadFile($uri, $_.FullName)
    }
}

Überwachung der Fortschritte

Schließlich übertragen Sie möglicherweise eine große Datei und müssen wissen, wie viel übertragen wurde. Ein Weg, um Überwachung der Fortschritte in PowerShell ist die zu verwenden Schreibfortschritt Cmdlet. Dieses Cmdlet bietet einen grafischen Fortschrittsbalken, der Ihnen anzeigt, wie weit es ist.
Im folgenden Skript sehen Sie allgemeinen Code aus den obigen Beispielen. Der größte Unterschied besteht darin, wie die Datei übertragen wird.
Um eine Prozessanzeige zu erhalten, müssen Sie die Datei nicht auf einmal, sondern in Blöcken hochladen und die verwenden Schreibfortschritt Cmdlet generiert einen fortlaufenden Fortschrittsbalken.

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [pscredential]$Credential,    [Parameter(Mandatory)]
    [string]$LocalPath,     [Parameter(Mandatory)]
    [string]$FtpServerHost
) $remoteFileName = $FilePath | Split-Path -Leaf
$request = [Net.WebRequest]::Create("ftp://$FtpServerHost/$remoteFileName") $ftpPassword = $Credential.GetNetworkCredential().Password
$webclient.Credentials = New-Object System.Net.NetworkCredential($Credential.Username, $ftpPassword) $request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $fileStream = [System.IO.File]::OpenRead($LocalFilePath)
$ftpStream = $request.GetRequestStream() $buffer = New-Object Byte[] 10240
while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0) {
    $ftpStream.Write($buffer, 0, $read)
    $pct = ($fileStream.Position / $fileStream.Length)
        $prgParams = @{
            'Activity' =  'Uploading'
            'Status' =  ("{0:P0} complete:" -f $pct)
      'PercentComplete' = ($pct * 100)
        }
    Write-Progress @prgParams
} $fileStream.CopyTo($ftpStream) $ftpStream.Dispose()
$fileStream.Dispose()

Wenn Sie ein Systemadministrator sindWahrscheinlich verstehen Sie nicht den gesamten erweiterten .NET-Code in diesem Artikel. Aber eines der besten Dinge beim Schreiben solcher Aufgaben ist, dass Sie es nicht müssen. Nutzen Sie den vorhandenen Code, der hier bereitgestellt wird, und beginnen Sie, die Skripte selbst auszuführen, anstatt sich in den Code zu vertiefen.

Similar Posts

Leave a Reply