Einstellbare Parameter in txt und PowerShell Script übergeben
Erstmal wünsche ich einen schönen guten Tag 
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:
openftp.txt:
Script:
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:
Variablen.ini:
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?
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?
10 Antworten
- LÖSUNG em-pie schreibt am 30.03.2021 um 10:07:41 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 10:18:55 Uhr
- LÖSUNG em-pie schreibt am 31.03.2021 um 10:40:04 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 10:43:33 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 12:01:10 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 14:39:01 Uhr
- LÖSUNG OKIDOKI schreibt am 04.04.2021 um 21:00:45 Uhr
- LÖSUNG Worker26 schreibt am 07.04.2021 um 08:31:28 Uhr
- LÖSUNG OKIDOKI schreibt am 04.04.2021 um 21:00:45 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 14:39:01 Uhr
- LÖSUNG em-pie schreibt am 31.03.2021 um 10:40:04 Uhr
- LÖSUNG Worker26 schreibt am 31.03.2021 um 10:18:55 Uhr
- LÖSUNG manuel-r schreibt am 30.03.2021 um 10:32:08 Uhr
- LÖSUNG Worker26 schreibt am 30.03.2021 um 10:42:53 Uhr
LÖSUNG 30.03.2021, aktualisiert um 10:11 Uhr
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/)
Und ein Einlesen von Parametern könnte so aussehen:
(Quelle: https://stackoverflow.com/questions/12368142/powershell-retrieving-a-var ...
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
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[0] -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
LÖSUNG 30.03.2021 um 10:32 Uhr
Oder du schreibst deine Parameter als JSON in eine Datei und liest die dann per PS ein
Manuel
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
- https://www.windowspro.de/script/json-powershell-erzeugen-bearbeiten
Manuel
LÖSUNG 30.03.2021 um 10:42 Uhr
Danke für die Antworten, ich werde mal schauen was ich daraus machen kann :D
LÖSUNG 31.03.2021 um 10:18 Uhr
Hallo 
@em-pie
Ich habe das jetzt so gemacht, wie oben beschrieben
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
[], MethodInvocationException
+ FullyQualifiedErrorId : WebException
Woran kann es liegen, dass keine Verbindung aufgebaut werden kann?
@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
$Run = $FTPRequest.GetRequestStream()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (+ FullyQualifiedErrorId : WebException
Woran kann es liegen, dass keine Verbindung aufgebaut werden kann?
LÖSUNG 31.03.2021 um 10:40 Uhr
Du hast ja sicherlich die Zeilen 1-4 auf deine Bedürfnisse angepasst, oder?
LÖSUNG 31.03.2021 um 10:43 Uhr
ja klar 
LÖSUNG 31.03.2021 um 12:01 Uhr
Problem gelöst, das Passwort hatte ein $ Zeichen enthalten. Hab das Passwort nun mit '' anstelle von "" übergeben und nun funktioniert es 
LÖSUNG 31.03.2021 um 14:39 Uhr
Nochmal Hallo :D
Jetzt habe ich nochmal eine Frage.
Ich übergebe meine Parameter aus der Text Datei so:
In der Datei unter $path steht folgendes drin:
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:
In der Datei unter $path steht folgendes drin:
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
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
LÖSUNG 04.04.2021 um 21:00 Uhr
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"
Nun wird die Variable angezeigt: C:\Temp\file.zip
Gruß okidoki
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
LÖSUNG 07.04.2021 um 08:31 Uhr
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