worker26
Goto Top

Einstellbare Parameter in txt und PowerShell Script übergeben

Erstmal wünsche ich einen schönen guten Tag face-smile
Nun zu meinem Problem:
Ich logge mich bei einem ftp Server ein. Kopiere dort eine Datei hin und verlasse den ftp Server wieder. danach erstelle ich eine log Datei, über den Verlauf des Kopiervorgangs und sende mir diese per Mail. Realisiert habe ich das mit einer Batch Datei, einer txt Datei und einem PowerShell Script.
Batch:
 
set LogDir=PFADZURLOGDATEI
set LogFile=NAMELOGDATEI
set LogFileDir=%LogDir%\%LogFile%

ftp -i -s:openftp.txt 

PowerShell.exe -ExecutionPolicy Bypass -Command "& 'PFADZURPOWERSHELLEXE'" /j  

openftp.txt:
open DOMAIN
USERNAME
PASSWORD
lcd PFADDERZUUEBERTRAGENDENDATEI
put DATEI
close
quit

Script:
$abs=
$emp=
$sub="Meldung Hompage"  
$att=
$User = 
$PWord = ConvertTo-SecureString -String "PASSWORD" -AsPlainText -Force  
$Credential = New-Object System.Management.Automation.PSCredential (“User”, $PWord)
Send-MailMessage -To $emp -From $abs -Subject "Bericht" -Body "Im Anhang befindet sich die log Datei :)" -Credential ($Credential) -Attachments $att -SmtpServer "SERVER"  

Ich soll jetzt die ganzen einstellbaren Parameter wie USERNAME, FTPSERVER,... und Pfade in eine eigene txt oder ini Datei speichern und von dort dann auslesen. (Variablen.ini)
Ich weis, dass ich mit folgenden etwas auslesen kann, wenn ich weis, in welcher Zeile sich der gewünschte Parameter befindet:
@echo off

set LineNo=2

set "Server="  

set /a LineNo-=1

for /f "tokens=1,2* delims==" %%a in ('more/e +%LineNo% ^< Variablen.ini') do (  
	if not defined Server set "Server=%%b"  
)


Variablen.ini:
[Server]
ftpserver=DOMAIN
ftpuser=USER
ftppw=PASSWORD

nun ließt es mir die zweite Zeile also ftpserver=DOMAIN aus und schreibt mir DOMAIN in die Variable Server.
Wie kann ich nun diese Werte an das PowerShell Skript und das openftp.txt File übergeben um diese dann dort zu verwenden?

Content-ID: 665264

Url: https://administrator.de/contentid/665264

Ausgedruckt am: 19.11.2024 um 13:11 Uhr

em-pie
Lösung em-pie 30.03.2021 aktualisiert um 10:11:52 Uhr
Goto Top
Moin,

ich würde aus dem Powershell und Batch-Mix ein reines Powershell-Script erstellen (zzgl. der txt.Datei)

Beispielsweise so (Quelle: https://www.thomasmaurer.ch/2010/11/powershell-ftp-upload-and-download/)
### UPLOAD FILES
# Config
$Username = "FTPUSER"  
$Password = "P@assw0rd"  
$LocalFile = "C:\Temp\file.zip"  
$RemoteFile = "ftp://thomasmaurer.ch/downloads/files/file.zip"  
 
# Create FTP Rquest Object
$FTPRequest = [System.Net.FtpWebRequest]::Create("$RemoteFile")  
$FTPRequest = [System.Net.FtpWebRequest]$FTPRequest
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
$FTPRequest.UseBinary = $true
$FTPRequest.UsePassive = $true
# Read the File for Upload
$FileContent = gc -en byte $LocalFile
$FTPRequest.ContentLength = $FileContent.Length
# Get Stream Request by bytes
$Run = $FTPRequest.GetRequestStream()
$Run.Write($FileContent, 0, $FileContent.Length)
# Cleanup
$Run.Close()
$Run.Dispose()

### DOWNLOAD FILES
# Config
$Username = "FTPUSER"  
$Password = "P@assw0rd"  
$LocalFile = "C:\Temp\file.zip"  
$RemoteFile = "ftp://thomasmaurer.ch/downloads/files/file.zip"  
 
# Create a FTPWebRequest
$FTPRequest = [System.Net.FtpWebRequest]::Create($RemoteFile)
$FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$FTPRequest.UseBinary = $true
$FTPRequest.KeepAlive = $false
# Send the ftp request
$FTPResponse = $FTPRequest.GetResponse()
# Get a download stream from the server response
$ResponseStream = $FTPResponse.GetResponseStream()
# Create the target file on the local system and the download buffer
$LocalFileFile = New-Object IO.FileStream ($LocalFile,[IO.FileMode]::Create)
[byte[]]$ReadBuffer = New-Object byte 1024
# Loop through the download
do {
  $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
  $LocalFileFile.Write($ReadBuffer,0,$ReadLength)
} 
while ($ReadLength -ne 0)

Und ein Einlesen von Parametern könnte so aussehen:
(Quelle: https://stackoverflow.com/questions/12368142/powershell-retrieving-a-var ..)
## myParameters.txt
ftpserver=myftp.serv.er
ftpuser=someUsr
ftppwd=T0pS3cr37

Get-Content myParameters.txt | Foreach-Object{
   $var = $_.Split('=')  
   New-Variable -Name $var -Value $var[1]
}



Edit:
schaue dir auch mal die Lösung des Entwicklers von WinSCP, Martin Prikryl, an:
https://stackoverflow.com/questions/19059394/powershell-connect-to-ftp-s ...
Hier zur Überschrift "3rd party library" scrollen

Gruß
em-pie
manuel-r
manuel-r 30.03.2021 um 10:32:08 Uhr
Goto Top
Worker26
Worker26 30.03.2021 um 10:42:53 Uhr
Goto Top
Danke für die Antworten, ich werde mal schauen was ich daraus machen kann :D
Worker26
Worker26 31.03.2021 um 10:18:55 Uhr
Goto Top
Hallo face-smile
@em-pie
Ich habe das jetzt so gemacht, wie oben beschrieben
$Username = "FTPUSER"  
$Password = "P@assw0rd"  
$LocalFile = "C:\Temp\file.zip"  
$RemoteFile = "ftp://thomasmaurer.ch/downloads/files/file.zip"  
 
# Create FTP Rquest Object
$FTPRequest = [System.Net.FtpWebRequest]::Create("$RemoteFile")  
$FTPRequest = [System.Net.FtpWebRequest]$FTPRequest
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
$FTPRequest.UseBinary = $true
$FTPRequest.UsePassive = $true
# Read the File for Upload
$FileContent = gc -en byte $LocalFile
$FTPRequest.ContentLength = $FileContent.Length
# Get Stream Request by bytes
$Run = $FTPRequest.GetRequestStream()

Beim Ausführen der letzten Zeile bekomme ich jedoch diese Fehlermeldung:
Ausnahme beim Aufrufen von "GetRequestStream" mit 0 Argument(en): "Die Verbindung mit dem Remoteserver kann nicht
hergestellt werden."
In Zeile:1 Zeichen:1

back-to-top$Run = $FTPRequest.GetRequestStream()

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile , MethodInvocationException
+ FullyQualifiedErrorId : WebException

Woran kann es liegen, dass keine Verbindung aufgebaut werden kann?
em-pie
Lösung em-pie 31.03.2021 um 10:40:04 Uhr
Goto Top
Du hast ja sicherlich die Zeilen 1-4 auf deine Bedürfnisse angepasst, oder?
Worker26
Worker26 31.03.2021 um 10:43:33 Uhr
Goto Top
ja klar face-smile
Worker26
Worker26 31.03.2021 um 12:01:10 Uhr
Goto Top
Problem gelöst, das Passwort hatte ein $ Zeichen enthalten. Hab das Passwort nun mit '' anstelle von "" übergeben und nun funktioniert es face-smile
Worker26
Worker26 31.03.2021 um 14:39:01 Uhr
Goto Top
Nochmal Hallo :D
Jetzt habe ich nochmal eine Frage.
Ich übergebe meine Parameter aus der Text Datei so:
$var = Get-Content $path | ForEach-Object { $_ | select-string "LogInUser*"}  
$Username = $var-Replace("LogInUser=","")  

In der Datei unter $path steht folgendes drin:
LogInUser=USERNAME

Im ersten Schritt schreibt er mir also LogInUser=USERNAME auf $var
Im zweiten Schritt ersetzt er LogInUser= durch nichts, und schreibt dies auf $Username.

Dies funktioniert auch prima.
Nun möchte ich aber das selbe Prinzip bei Pfaden anwenden, das sollte dann etwa so aussehen:
$var = Get-Content $path | ForEach-Object { $_ | select-string "Path*"}  
$LocalFile = $var-Replace("Path=","")  

In der Datei unter $path steht folgendes drin:
Path=C:\Temp\file.zip

dies funktioniert aber nicht, da ich die Variable hier nicht einsetzen kann so das es das selbe macht wie vorhin:
$FileContent = gc -en byte $LocalFile
OKIDOKI
OKIDOKI 04.04.2021 um 21:00:45 Uhr
Goto Top
Frohe Ostern Worker26,

um den Path aus dem txt-file herauszubekommen hilft vielleicht dieser Ansatz:

Die Datei path.txt enthält: "Path=C:\Temp\file.zip"

@echo off& setlocal
for /F "delims=" %%A IN ('findstr /C:"Path" "path.txt"') DO set pin=%%A  
for /F "tokens=1,* delims==" %%i in ("%pin%") do set string=%%j  
echo %string%

Nun wird die Variable angezeigt: C:\Temp\file.zip

Gruß okidoki
Worker26
Worker26 07.04.2021 um 08:31:28 Uhr
Goto Top
Danke für die Hilfe, ich hatte aber einen Fehler bei der Pfadangabe, da es sich um einen UNC Pfad handelt. Es funktioniert, man muss nur das richtige hinschreiben :D