Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst PowerShell-VB - Pfad wird bei Parameterübergabe abgeschnitten

Mitglied: Pat.bat

Pat.bat (Level 1) - Jetzt verbinden

16.10.2019 um 10:33 Uhr, 216 Aufrufe, 8 Kommentare

Hallo zusammen,

ich stoße momentan auf folgendes Problem:

in meinem VB.Net Programm rufe ich ein Powershell Skript auf und übergebe 2 Parameter die in VB vorher gefüllt werden:

01.
        Dim Zahlliste As String = txtBoxFile.Text.ToString()
02.
        procStartInfo.Arguments = "-File " & Application.StartupPath & "\Skripts\ZahllistenErstellen.ps1 -PfadText " & Zahlliste & " -Speicherpfad " & PathToday
in PowerShell wird das dann wie folgt verarbeitet:

01.
param(
02.
    [String]$PfadText,
03.
    [String]$Speicherpfad
04.
)
05.

06.
Push-Location $(Split-Path $Script:MyInvocation.MyCommand.Path)
07.

08.
$DMYToday = Get-Date -Format "dd-MM-yyyy"
09.

10.
$TempPath = "$env:TEMP\Zahllisten\"
11.

12.
If (!(Test-Path $TempPath))
13.
{
14.
    mkdir $TempPath
15.
}
16.
Else
17.
{
18.
    Remove-Item -Path $TempPath -Force -Recurse
19.
    mkdir $TempPath
20.
}
21.

22.
$Textdatei = "$PfadText"
23.

24.
$CSV = "$env:TEMP\Zahllisten\Zahlliste.csv" # in Temp Ordner generieren
25.
$arrCols = @("Buchungnummer", "angew.", "Abwahl")
26.

27.
((Get-Content "$Textdatei") -replace '^\s+','' ) -replace ' *\t *',';' | `
28.
convertfrom-csv -Delimiter ";" | `
29.
select * -excludeproperty $arrCols | `
30.
export-csv -path $CSV -delimiter ";" -Encoding utf8 -NoTypeInformation
Da der Pfad in $PfadText allerdings Leerzeichen enthält schneidet er mir den Pfad immer ab, obwohl ich ihn auch hier nochmal als String an eine Variable $Textdatei übergebe.

ps fehler - Klicke auf das Bild, um es zu vergrößern

Der Vollständige Pfad hätte so aussehen sollen:

G:\FD_50_Bank\System\Prosoz Batch Verwaltung\Zahlliste\Archiv\2019\10-2019\2019-10-10\Gesamt.txt

Den Vorgang Debugge ich aus Visual Studio heraus, sodass ich den PS Code leider nicht direkt debuggen kann.


Meine Frage nun, wo liegt der Fehler? Ist er bei der Parameter Abfrage in PS ganz oben oder warum gibt er nicht den gesamten String rüber? In VB ist der Pfad noch in Ordnung.

Vielen Dank im Voraus.
Mitglied: emeriks
LÖSUNG 16.10.2019, aktualisiert um 10:40 Uhr
Hi,
im VB.Net mit "" um den Pfad arbeiten

01.
        Dim Zahlliste As String = txtBoxFile.Text.ToString()
02.
        procStartInfo.Arguments = "-File """ & Application.StartupPath & "\Skripts\ZahllistenErstellen.ps1"" -PfadText """ & Zahlliste & """ -Speicherpfad """ & PathToday & """"
E.

Edit:
Für sowas empfiehlt sich dann auch String.Format
01.
        Dim Zahlliste As String = txtBoxFile.Text.ToString()
02.
        procStartInfo.Arguments = String.Format("-File ""{0}\Skripts\ZahllistenErstellen.ps1"" -PfadText ""{1}"" -Speicherpfad ""{2}"" ", Application.StartupPath, Zahlliste, PathToday)
Bitte warten ..
Mitglied: 141320
16.10.2019, aktualisiert um 10:38 Uhr
Na überall Anführungszeichen vergessen , das sollte man doch eigentlich wissen wenn man Pfade in der Konsole als Parameter übergibt die Leerzeichen enthalten!
01.
procStartInfo.Arguments = "-File """ & Application.StartupPath & "\Skripts\ZahllistenErstellen.ps1"" -PfadText """ & Zahlliste & """ -Speicherpfad """ & PathToday & """"
edit too late
Bitte warten ..
Mitglied: Pat.bat
16.10.2019 um 11:41 Uhr
Danke das hat geholfen.

Leider hat mein Skript noch ein anderes Problem und ich finde nicht den Fehler.

Wenn ich das Skript direkt über VSCode starte, bekomme ich zwar ein paar Fehler, aber es läuft trotzdem durch und macht was es soll.

Starte ich das Skript nun über meine VB Anwendung, kommt folgender Fehler:

psfehler - Klicke auf das Bild, um es zu vergrößern

Wenn ich das Skript direkt ausführe, übergebe ich die Parameter, die normal über die VB App kommen würden, direkt. Jedoch gleicher Pfad etc.
Dann erstellt mir die Excel Dateien.

Ich poste einfach mal das gesamte Skript hier.

Als erstes die Sub in VB:

01.
    Private Sub BGW_DoWork(sender As Object, e As DoWorkEventArgs) Handles BGW.DoWork
02.
        Dim PathToday As String
03.
        PathToday = "\\Vdm-11\lup-daten\FD_50_Bank\Einrichtungen_Zahllisten\" _
04.
                                & Format(DateTimePicker1.Value, "yyyy") & "\" & Format(DateTimePicker1.Value, "MM-yyyy") & "\" & Format(DateTimePicker1.Value, "dd-MM-yyyy") & "\"
05.

06.
        ' Wenn Ausgabeverzeichnis noch nicht existiert, dann erstellen
07.
        If Not (Directory.Exists(PathToday)) Then
08.
            Directory.CreateDirectory(PathToday)
09.
        End If
10.

11.
        Dim proc As Process
12.
        Dim procStartInfo As ProcessStartInfo
13.
        procStartInfo = New ProcessStartInfo
14.
        procStartInfo.FileName = "powershell.exe"
15.
        'procStartInfo.CreateNoWindow = True
16.
        'procStartInfo.UseShellExecute = False
17.
        Dim Zahlliste As String = txtBoxFile.Text.ToString()
18.
        procStartInfo.Arguments = String.Format("-File ""{0}\Skripts\ZahllistenErstellen.ps1"" -PfadText ""{1}"" -Speicherpfad ""{2}"" -Date ""{3}"" ", Application.StartupPath, Zahlliste, PathToday, Format(DateTimePicker1.Value, "dd.MM.yyyy"))
19.
        proc = Process.Start(procStartInfo)
20.
        proc.WaitForExit()
21.

22.
        ' Prüfen ob Temp Ordner noch existiert, ansonsten löschen.
23.
        If (Directory.Exists(Path.GetTempPath & "\Zahllisten")) Then
24.
            Directory.Delete(Path.GetTempPath & "\Zahllisten", True)
25.
        End If
26.

27.
        MsgBox("Fertig")
28.
    End Sub
Und dann das eigentliche PS Skript:

01.
param(
02.
    [String]$PfadText,
03.
    [String]$Speicherpfad,
04.
    [String]$Date
05.
)
06.

07.
Push-Location $(Split-Path $Script:MyInvocation.MyCommand.Path)
08.

09.
# Für Debugging Zwecke
10.
$YearToday = Get-Date -Format "yyyy"
11.
$MYToday = Get-Date -Format "MM-yyyy"
12.
$DMYToday = Get-Date -Format "dd-MM-yyyy"
13.

14.
$PfadText = "H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\bin\Debug\Zahlliste\Gesperrt.txt"
15.
#$PfadText = "H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\bin\Debug\Zahlliste\Gesperrt.txt"
16.
$Speicherpfad = "\\Vdm-11\lup-daten\FD_50_Bank\Einrichtungen_Zahllisten\$YearToday\$MYToday\$DMYToday\"
17.
$Date = Get-Date -Format "dd.MM.yyyy"
18.

19.
# Temp Ordner erstellen, wenn noch nicht vorhanden
20.
$TempPath = "$env:TEMP\Zahllisten\"
21.
If (!(Test-Path $TempPath))
22.
{
23.
    mkdir "$TempPath"
24.
}
25.
Else
26.
{
27.
    Remove-Item -Path "$TempPath" -Force -Recurse
28.
    mkdir "$TempPath"
29.
}
30.

31.
$CSV = "$env:TEMP\Zahllisten\Zahlliste.csv" # in Temp Ordner generieren
32.
$arrCols = @("Buchungnummer", "angew.", "Abwahl")
33.
#$arrNames = @("*ANKER*", "*Kloster*")
34.

35.
((Get-Content "$PfadText") -replace '^\s+','' ) -replace ' *\t *',';' | `
36.
convertfrom-csv -Delimiter ";" | `
37.
select * -excludeproperty $arrCols | `
38.
# where { $_."ZE-Name" -like $arrNames } |  `
39.
export-csv -path $CSV -delimiter ";" -Encoding utf8 -NoTypeInformation
40.

41.
$datasets = $(import-csv $csv -delimiter ";")
42.
foreach($dataset in $datasets) {
43.
    
44.
    $dataset | export-csv -path "$TempPath$($dataset.'ZE-Name').csv" -Append -Delimiter ";" -Encoding UTF8 -NoTypeInformation -Force
45.

46.
}
47.

48.
Remove-Item -Path $CSV
49.
$Files = Get-ChildItem -Path $TempPath
50.

51.
$xlo = New-Object -ComObject excel.application
52.
$xlo.visible = $false
53.
$xlo.DisplayAlerts = $false
54.

55.
foreach ($File in $Files) 
56.
{
57.
# csv-datei in Excel einlesen
58.
$xlw = $xlo.Workbooks.Add("$TempPath$File")
59.
$xls = $xlw.worksheets.Item(1)
60.

61.
# Spalte löschen
62.
$xlo.ActiveSheet.Range("L:L").EntireColumn.Delete()
63.

64.
# Daten in Tabelle umwandeln
65.
$ListObject = $xlo.ActiveSheet.ListObjects.Add([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange, $xlo.ActiveCell.CurrentRegion, $null, [Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes)
66.
$ListObject.Name = "TableData"
67.
$ListObject.TableStyle = "TableStyleMedium9"
68.

69.
# Zeile hinzufügen
70.
$eRow = $xlo.ActiveSheet.cells.item(1,1).entireRow
71.
$active = $eRow.activate()
72.
for ($i=1; $i -le 5; $i++)
73.
{
74.
    $active = $eRow.insert($xlShiftDown)
75.
} 
76.

77.
# Logo hinzufügen
78.
$imgPath = 'G:\FD_50_Bank\System\Prosoz Batch Verwaltung\Media\LUP Logo.jpg'
79.
$LinkToFile = $false
80.
$SaveWithDocument = $true
81.
$Left = 1
82.
$Top = 1
83.
$Width = 300
84.
$Height = 67
85.
$img = $xlo.ActiveSheet.Shapes.AddPicture($imgPath, $LinkToFile, $SaveWithDocument, $Left, $Top, $Width, $Height)
86.
$xlo.Speech.Speak("Bild wurde eingefügt")
87.

88.
$xlo.ActiveWindow.DisplayGridlines = $false
89.

90.
# Spaltenbreite anpassen
91.
$xlo.ActiveSheet.Range("A:K").EntireColumn.AutoFit()
92.

93.
# Speichern der Excel Datei
94.
$Filename = $File -replace ".csv","" -replace ",.csv", ""
95.
If ($Filename.EndsWith(","))
96.
{
97.
   $Filename = $Filename -replace ",",""
98.
}
99.

100.
If ("$PfadText" -like "*Gesamt.txt")
101.
{ 
102.
    if (!(Test-Path "$Speicherpfad$Filename")){ 
103.
    md -Path "$Speicherpfad$Filename"
104.
    }
105.
    $xlo.ActiveWorkbook.SaveAS( "$Speicherpfad$Filename\Gesamt_$Date.xlsx", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault)
106.
}
107.
elseif ("$PfadText" -like "*Gesperrt.txt") 
108.
{
109.
    if (!(Test-Path "$Speicherpfad$Filename")){ 
110.
        md -Path "$Speicherpfad$Filename"
111.
        }
112.
    $xlo.ActiveWorkbook.SaveAS( "$Speicherpfad$Filename\Gesperrt_$Date.xlsx", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault) 
113.
}
114.

115.
$xls = $null
116.
$xlw.Close()
117.
}
118.

119.
$xlo.Quit()
120.

121.
# TEMP Datei löschen, da nicht mehr gebraucht
122.
Remove-Item -Path $TempPath -Force -Recurse
123.

124.
Pop-Location

Ich hoffe mein Praxisbuch kommt bald, damit ich hier nicht mehr soviel posten muss :D. Aber ich verstehe nicht warum es über die App nicht funktioniert, und über das Skript direkt alles einigermaßen ordentlich ausgeführt wird. Es muss ja theoretisch ein Fehler bei der Übergabe der Parameter sein, Jedoch sind die Pfad in VB und PS gleich, soweit ich sehe.
Bitte warten ..
Mitglied: emeriks
16.10.2019, aktualisiert um 11:49 Uhr
In PS-Script übersteuerst Du die Script-Parameter in Zeilen 14 & 16. Soll das so sein?

In VB.Net, Zeile 4: "\" am Ende? Soll das so sein?
Bitte warten ..
Mitglied: Pat.bat
16.10.2019 um 12:07 Uhr
In Zeile 14 und 16 war das nur zu debugging Zwecken hinterlegt, wenn ich das Skript ohne die VB-App ausführe. Ansonsten ist das auskommentiert.

in VB Zeile 4 muss das "\" am Ende, sonst erstellt er mir einen Ordner pro Zahlungsempfänger mit Datum vorne weg.

Ich möchte aber die Ordner pro ZE in dem Datumsordner haben:

So würde er es machen ohne dem Backslash, was falsch wäre:

falsch - Klicke auf das Bild, um es zu vergrößern

und so soll es sein: (wenn ich das PS Skript direkt ausführe):

richtig - Klicke auf das Bild, um es zu vergrößern



Wenn ich das Backslash in VB entferne führt erstellt er mir die Excel Dateien, aber halt nur in den falschen Ordner. Lasse ich das Backslash in VB stehen, gibts wieder die PS Fehlermeldung mit dem Illegalen Zeichen, siehe oben.
Kurios ist, das dass Backslash, wenn ich den Pfad direkt im PS Skript übergebe funktioniert...

anbei nochmal der Fehler aus PS:

psfehler - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: emeriks
16.10.2019 um 12:12 Uhr
Setze mal im PS vor Zeile 112
01.
Write-Host "$Speicherpfad$Filename\Gesperrt_$Date.xlsx"
Was kommt dabei heraus?
Bitte warten ..
Mitglied: Pat.bat
16.10.2019 um 12:23 Uhr
Ups was macht er denn da:

writehostausgabe - Klicke auf das Bild, um es zu vergrößern

Wenn ich jetzt in VB das Backslash entferne und füge ein Backslash in PS zwischen $Speicherpfad und $Filename ein, funktioniert es.

Aber wie er das oben im Bild erzeugt ist mir schleierhaft und das nur weil der letztes Backslash über VB kommt ???
Bitte warten ..
Mitglied: 141320
16.10.2019, aktualisiert um 12:43 Uhr
Aber wie er das oben im Bild erzeugt ist mir schleierhaft und das nur weil der letztes Backslash über VB kommt ???
Weil der Backslash in der CMD in der du ja den PS Befehl ausführst ein Escape-Zeichen ist und du damit das Anführungszeichen als gewollten String kennzeichnest, und dieser ist nunmal in einem Pfad illegal!
https://www.robvanderwoude.com/escapechars.php
Setze den Pfad in den Argumenten in 'single quotes' bzw. Hochkommas oder escape ihn mit \\ dann ist das egal.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershell Pfad überprüfen
gelöst Frage von H41mSh1C0RBatch & Shell11 Kommentare

Hi @ PS Profis, Irgendwie seh ich den Wald vor lauter Bäumen nicht. (oder es ist einfach Zeit für ...

Batch & Shell
Powershell: Variable in Pfad einbauen
gelöst Frage von ThunderbirdOPBatch & Shell2 Kommentare

Hallo Leute, ich würde gerne eine Variable in einen Pfad einsetzen, bekomme aber immer den Fehler zurück, dass der ...

Batch & Shell
Problem mit UNC-Pfad ? powershell-skript
Frage von today12Batch & Shell2 Kommentare

Hallo liebe Community, ich hab ein kleines Verständnis Problem mit UNC-Pfade. ich möchte mein Skript auf ein Netzlaufwerk legen, ...

Batch & Shell

PowerShell Add-Content Pfad mit Leerzeichen

gelöst Frage von timsen-96Batch & Shell7 Kommentare

Es funktioniert nicht, da bei "Config Files" und bei "Default Config" ein Leerzeichen ist. Kann mir jemand helfen und ...

Neue Wissensbeiträge
Humor (lol)
Das IoT wird schlimmer
Erfahrungsbericht von Henere vor 20 StundenHumor (lol)3 Kommentare

Nun auch schon über den WSUS:

Sicherheit

Win10 1809 und höher erlauben nun das Sperren und Whitelisten von bestimmten Geräten

Tipp von DerWoWusste vor 1 TagSicherheit1 Kommentar

Vor 1809 konnten nur Geräteklassen gesperrt werden, nun können endlich einzelne Device instance IDs gewhitelistet werden (oder andersherum: gesperrt ...

Windows 10

Hands-On: What is new in the Windows 10 November 2019 Update?

Information von DerWoWusste vor 1 TagWindows 10

Die wenigen (aber zum Teil interessanten) Neuheiten werden in diesem Video sehr schnell erklärt und vorgeführt.

Grafik

Gute Spiele aus der Ubuntu Repository: SuperTuxKart

Information von NetzwerkDude vor 2 TagenGrafik2 Kommentare

Fall jemand die Firmenpolicy hat das man Linux Software nur aus dem default Repository installieren kann: Ich habe festgestellt ...

Heiß diskutierte Inhalte
Ubuntu
Ubuntu-Putty hilfe
gelöst Frage von Nickolas.GroheUbuntu53 Kommentare

Hallo Wie ändere ich einen ssh Port auf Linux Ubuntu? LG Nickolas

Windows 7
Festplatte in einen anderen PC umziehen lassen
Frage von Ghost108Windows 729 Kommentare

Hallo zusammen, ich bekomme die nächsten Tage einen neuen PC (komplett andere Hardware als in meinem jetzigen) Was für ...

LAN, WAN, Wireless
10G Netzwerk konfigurieren für maximalen Datendurchsatz
Frage von hukimanLAN, WAN, Wireless29 Kommentare

Guten Morgen, in unserem Betrieb wurde das Netzwerk auf 10G (Kupfer) umgerüstet. Grund dafür sind große Laserscandaten die sehr ...

Microsoft Office
Abfrage ist beschädigt. Error-Code 3340 in Access2013
gelöst Frage von RomualdMicrosoft Office16 Kommentare

Hallo Foren-Mitglieder, ich hätte da mal ein Problem Seit heute am Morgen (13.11.2019) erhalte ich die Fehlermeldung "Abfrage '' ...