Excel (csv) PowerShell-Skript hört nicht auf zu arbeiten?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

(statt $env:username würde ich gleich $env:userprofile nehmen - bzw. gleich den kompletten Dateipfad entweder als Konstante oder als Variable nehmen)

Steht da hinter "-Replace" wirklich nur ein Komma zwischen Anführungszeichen?

-----

Hast du irgendeinen Debugger für PowerShell? (Z. B. VisualStudio)

Kannst du darin sehen, in welcher Zeile das Script hängenbleibt?

Notfalls lässt du dir zwischen je 2 Zeilen eine Notiz ausgeben.

-----

Ich hätte den Verdacht, dass die Save-Routine zurückfragt, ob als CSV oder Excel-Workbook gespeichert werden soll oder ob die existierende CSV-Datei überschrieben werden soll. (Früher wurde eine CSV-Datei streng genommen nicht geöffnet, sondern in ein neues Workbook importiert und entsprechend beim Speichern gefragt, ob überschrieben werden soll - das ist heute vermutlich noch genauso.) Es müsste Argumente für Save() geben, die genau diese Einstellungen ("als CSV", "überschreiben ohne Rückfrage") festlegen.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
Ballz165 
Fragesteller
 17.08.2022, 10:33

Hallo, danke für die Antwort!

Ja ich habe VS installiert
Nein, ich kann leider nicht sehen, wo das Skript hängen bleibt
Wie lasse ich mir Notizen ausgeben?

Danke!

0
PWolff  17.08.2022, 14:30
@Ballz165

Wie man ein PowerShell-Script in VS oder VS Code debuggen kann: https://www.google.com/search?q=powershell+debugging+visual+studio

Da Visual Studio wesentlich mehr Möglichkeiten bietet als Visual Studio Code, würde ich erst einmal probieren, was stackoverflow dazu sagt: https://stackoverflow.com/questions/35298963/how-do-i-debug-a-windows-powershell-module-in-visual-studio

Ausgabe einer Notiz: am einfachsten mit

echo "Markierung 5"

Aber wenn ich Excel verwende, würde ich (ich persönlich) VBA verwenden, damit habe ich schon gearbeitet, als PowerShell noch nicht einmal konzipiert war. Das bietet ebenfalls sehr gute Möglichkeiten zum Debuggen. Allerdings muss man sich da in eine etwas andere Syntax einarbeiten.

0
Ballz165 
Fragesteller
 18.08.2022, 10:23
@PWolff

Das debuggen bringt nichts, das Skript hört einfach nicht auf zu arbeiten...

0
PWolff  18.08.2022, 12:45
@Ballz165

Beim Debuggen kannst du das Script Schritt für Schritt ablaufen lassen.

Welche Befehle werden andauernd wiederholt?

Oder: Welcher Befehl wird gestartet, aber nie beendet?

0
Ballz165 
Fragesteller
 18.08.2022, 14:56
@PWolff

Es wiederholt sich immer wieder dieser Bereich des Skriptes:

  do {

    $search.Value() = $Search.value() -Replace ","

    $search = $Range.FindNext($search)

  } while ($null -ne $search -and $search.Address -ne $FirstAddress)

0
PWolff  18.08.2022, 15:15
@Ballz165

Was steht in $FirstAddress?

Was steht bei jedem Schleifendurchlauf in $search.Address? (Bis zur Wiederholung) (am besten mit einer "abgespeckten" Tabelle, die nur 3 oder 4 Zeilen enthält)

Zwar sollte -ne stärker "binden" als -and, vorsichtshalber könntest du aber mal

while (($null -ne $search) -and ($search.Address -ne $FirstAddress))

ausprobieren.

-----

Wird $search.Value korrekt ersetzt? Mit den Klammern in $search.Value() würde ich erwarten, dass hier der Rückgabewert einer Funktion steht.

Außerdem könnte es sein, dass in $search.Value eine Zahl steht, die nur mit Komma dargestellt wird, aber kein String ist, das ein Komma enthalten könnte.

0
Ballz165 
Fragesteller
 18.08.2022, 16:19
@PWolff

Ich weiß jetzt, warum es im Loop bleibt:

Normaler weiße sollte das Skript nur die erste Zeile (A1) der Exceltabelle kontrollieren und ersetzen und in den restlichen Spalten sollten die Punkte stehen bleiben, aber wenn die Punkte in den Anderen Spalten stehen bleiben, speichert das Skript die Datei nicht ab.

Sobald ich mit "strg + f" alle in der Exceltabelle vorhandenen Punkte mit einem Komma ersetzte, speichert das Skript die Csv-Datei normal ab.

Ich wollte dies jetzt beheben indem ich bei "$Range = $Worksheet.Range("A1")" so umschreibe : $Worksheet.Range("A1","B1","C1","D1".... bis "M1"). Warum auch immer, nimmt das Skript die Änderungen nicht und ersetzt trotzdem nur die erste Spalte.

0
PWolff  18.08.2022, 16:24
@Ballz165

(Warum nennst du die Spalten alle einzeln und nimmst nicht einfach $Worksheet.Cells?)

Erhältst du demnach eine Fehlermeldung, wenn wenn das Script oder du versucht, das CSV zu speichern?

Ich habe deinen Code mal in VBA übersetzt (bis auf Laden und Abspeichern) - hier wird die Schleife korrekt verlassen:

Option Explicit

Private Sub CommandButton1_Click()
    Dim searchString As String
    Dim replaceString As String
    Dim searchRange As Range
    Dim searchResult As Range
    Dim firstAddress As String
    
    searchString = "."
    replaceString = ","
    Set searchRange = ActiveSheet.Range("A1").EntireColumn
    Set searchResult = searchRange.Find(searchString)
    
    If Not (searchResult Is Nothing) Then
        firstAddress = searchResult.Address
        Do
            searchResult.Value = Replace(searchResult.Value, searchString, replaceString)
            Set searchResult = searchRange.FindNext(searchResult)
            
            'While Not (Nothing Is searchResult) And searchResult.Address <> firstAddress -- VBA kennt keine "kurzgeschlossenen" Und- und Oder-Verknüpfungen
            If Nothing Is searchResult Then Exit Do
            'If searchResult.Address = firstAddress Then Exit Do
            If searchResult.Address = firstAddress Then
                MsgBox "Erneut in erster Zelle gefunden!"
                Exit Do
            End If
        Loop 'While Not (Nothing Is searchResult) And searchResult.Address <> firstAddress -- VBA kennt keine "kurzgeschlossenen" Und- und Oder-Verknüpfungen
    End If
End Sub


0