Extrahieren von Dateinamen aus der Ausgabe der svn-Konsole

428
nl-x

Mein Schildkröten-SVN- SVN updateBefehl gibt mir im Allgemeinen diese Ausgabe zurück:

C:\proj>svn update Updating '.': A 'some-file1.txt' D 'some-file2.txt' Restored 'some-file3.txt' U 'some'file4.txt' C 'some file5.txt' B At revision 123. 

Bitte beachten Sie, dass jede Zeile mit Ausnahme der ersten Zeile (immer beginnend mit Updating) und der letzten Zeile (immer beginnend mit At) immer Folgendes hat:

  • eine Aktion in der ersten Spalte. Dies kann ein Buchstabe oder ein Wort sein
  • eine Datei in der zweiten Spalte, in einfache Anführungszeichen eingeschlossen. Leider können Dateinamen einzelne Anführungszeichen oder Leerzeichen enthalten!
  • möglicherweise mehr Spalten mit einzelnen Buchstaben. Aber ich interessiere mich nicht für sie.

In einer Batchdatei, die ich schreibe, muss ich die Aktionen und Dateien haben. Die Aktionen, die ich schaffe, aber die Dateien sind mir zu kompliziert, scheint es. Technisch gesehen ist alles, was ich will, alles zwischen dem ersten einfachen und dem letzten einzelnen Zitat in der Zeile .

@echo off setlocal enabledelayedexpansion for /f "delims=" %%a in ('"svn update"') DO ( set line=%%a for /f "tokens=1" %%b in ("!line!") do ( set action=%%b if "!action!" neq "Updating" ( if "!action!" neq "At" ( set file= >>> I DON'T KNOW WHAT TO DO HERE <<< echo We did !action! to !file! ) ) ) ) 

Sobald diese Batchdatei ordnungsgemäß funktioniert, sollte sie Folgendes ausgeben:

We did A on some-file1.txt We did D on some-file2.txt We did Restored on some-file1.txt We did U on some'file1.txt We did C on some file1.txt 
1
Muss es bat sein, oder kann es vbscript oder sogar awk sein? Es scheint, dass die Anforderung darin besteht, Feld 1 und Feld 2 aus einer Ausgabedatei zu extrahieren. Die Herausforderung besteht jedoch darin, das Feld speziell für Feld 2 zu definieren. Es ist kein Platz beendet. Es ist nicht in Anführungszeichen eingeschlossen. Ich glaube nicht, dass Sie eine genaue Definition für Feld 2 vornehmen können - wie würden Sie beispielsweise mit "C 'some' file5.txt 'B" verfahren? Welche Definition Sie für dieses Beispiel verwenden, ist falsch. Ian McGowan vor 5 Jahren 0
Um einen vorgeschlagenen Ansatz hinzuzufügen - wenn nach Feld 2 keine Anführungszeichen möglich sind, definieren Sie Feld zwei als "alles vom ersten Anführungszeichen in der Zeile vorwärts, bis alles im letzten Anführungszeichen in der Zeile, die rückwärts sucht"? Ich kann mir vorstellen, dass dies ziemlich leicht in vbscript, perl oder awk geschieht, aber nicht in bat. Ian McGowan vor 5 Jahren 0

1 Antwort auf die Frage

0
nl-x

Ich habe anscheinend eine Lösung mit Powershell gefunden, indem ich die set file=Zeile durch folgende ersetzt habe

for /f "delims=" %%c in ('"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command ""$Env:line -replace '^^[^^'']*''' -replace '''[^^'']*$'"" "') DO ( set file=%%c ) 

Powershell nimmt die %line%(dort wird es genannt $Env:line) und ersetzt ^[^']*'mit nichts und ersetzt '[^']*$mit nichts und gibt die Zeichenfolge zurück, die dann wieder gefangen for /fund hineingestellt wird%file%