2016-07-07 49 views
1

Ich bin gerade dabei Powershell zu lernen und arbeite an einem kleinen Skript, das jede Nacht eine Gruppe von Dateien auf einen FTPS-Server hochlädt. Die Dateien befinden sich auf einer Netzwerkfreigabe in einem Unterverzeichnis, das das Datum in dem Name enthält. Die Dateien selbst beginnen alle mit der gleichen Zeichenfolge, sagen wir "JONES_". Ich habe dieses Skript für FTP arbeiten, aber ich verstehe nicht ganz, was ich tun müssen, um bekommen für FTPS zu arbeiten:FTPS-Upload in Powershell

# Set yesterday's date (since uploads will happen at 2am) 
$YDate = (Get-Date).AddDays(-1).ToString('MM-dd-yyyy') 

#Create Log File 
$Logfile = "C:\powershell\$YDate.log" 
Function LogWrite 
{ 
    Param ([string]$logstring) 

    Add-Content $Logfile -value $logstring 
} 


# Find Directory w/ Yesterday's Date in name 
$YesterdayFolder = Get-ChildItem -Path "\\network\storage\location" | Where-Object {$_.FullName.contains($YDate)} 


If ($YesterdayFolder) { 

    #we specify the directory where all files that we want to upload are contained 
    $Dir= $YesterdayFolder 
    #ftp server 
    $ftp = "ftp://ftps.site.com" 
    $user = "USERNAME" 
    $pass = "PASSWORD" 

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 


$FilesToUpload = Get-ChildItem -Path (Join-Path $YesterdayFolder.FullName "Report") | Where-Object {$_.Name.StartsWith("JONES","CurrentCultureIgnoreCase")} 
foreach($item in ($FilesToUpload)) 
    { 
     LogWrite "Uploading file: $YesterdayFolder\Report\$item" 
     $uri = New-Object System.Uri($ftp+$item.Name) 
     $webclient.UploadFile($uri, $item.FullName) 
    } 
    } Else { 
     LogWrite "No files to upload" 
    } 

Ich möchte lieber nicht mit einem 3rd-Party-Software-Lösung zu tun haben, Wenn überhaupt möglich.

Antwort

0

psftp Verwendung nicht für mich arbeiten. Ich konnte es nicht über SSL mit dem FTP verbinden. Ich landete (ungern?) Mit WinSCP mit diesem Code:

$PutCommand = '& "C:\Program Files (x86)\WinSCP\winscp.com" /command "open ftp://USER:[email protected]:21/directory/ -explicitssl" "put """"' + $Item.FullName + '""""" "exit"' 
Invoke-Expression $PutCommand 

In der foreach-Schleife.

1

Ich bin mir nicht sicher, ob Sie dies als "3rd Party Software" oder nicht, aber Sie können PSFTP aus Powershell ausführen. Hier ist ein Beispiel dafür, wie Sie, dass (source) tun könnten:

$outfile=$YesterdayFolder"\Report\"$item.Name 
"rm $outfile`nput $outfile`nbye" | out-file batch.psftp -force -Encoding ASCII 

$user = "USERNAME" 
$pass = "PASSWORD" 

&.\psftp.exe -l $user -pw $pass $ftp -b batch.psftp -be 
+0

Ich nehme die Zeile: '& \ psftp.exe -l $ user -pw $ geben $ ftp -b batch.psftp -be' ersetzt. ' $ webclient = New-Object System.Net. WebClient $ webclient.Credentials = New-Objekt System.Net.NetworkCredential ($ user, $ pass) ' ? – jms2k

+0

Ich denke, es ersetzt mehrere Zeilen in dem Code, den Sie vorgestellt haben. Im Wesentlichen wird psftp ausgeführt, wobei der Benutzername, das Passwort und die Liste der auszuführenden Befehle übergeben werden, was bedeutet, dass eine Codezeile das Anmelden und Hochladen der fraglichen Datei übernimmt. Das entfernt 3 Codezeilen nach meiner Zählung, aber Sie können es nach Belieben implementieren. – morgb