Excel (csv) PowerShell-Skript hört nicht auf zu arbeiten?
Hallo!
Ich muss in einer Excel-Tabelle per PowerShell alle Punkte (.) mit einem Komma (,) austauschen, ohne, dass die komplette Zahl ausgetauscht wird.
--------
Beispiel:
Aus 0.01 sollte 0,01 werden
--------
Das macht das Skript auch, nur wenn das Skript mit der Spalte "A1" fertig ist, arbeitet es einfach weiter - Es ersetzt nichts, es bleibt alles so wie es sein sollte, nur das Skript macht halt irgendwas, obwohl es die csv Datei speichern sollte, nachdem es mit der ersten Spalte fertig ist.
Kann mir bitte wer das Skript so modifizieren, dass es nach der ersten Spalte aufhört?
DANKE!
Das Skript:
"
$env:username
$usernameinfo = $env:username
$File = "c:\users\$usernameinfo\Desktop\Tests\Excel\file.csv"
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheet = $Workbook.Worksheets.Item(1)
$SearchString = "."
$Range = $Worksheet.Range("A1").EntireColumn
$Search = $Range.find($SearchString)
if ($search -ne $null) {
$FirstAddress = $Search.Address
do {
$search.Value() = $Search.value() -Replace ","
$search = $Range.FindNext($search)
} while ($search -ne $null -and $search.Address -ne $FirstAddress)
}
$WorkBook.Save()
$WorkBook.Close()
[void]$excel.quit()
"
1 Antwort
(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.
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.
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.
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.
(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
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!