lefg 276 Geschrieben 23. April 2013 Melden Teilen Geschrieben 23. April 2013 (bearbeitet) for /f "tokens=2 delims=<>" %%i in (C:\Inhalt.txt) do echo %%i|findstr "Tag" pause Ob man so weiter kommt? Mir erscheint das heute sehr mühselig. Ich teste wohl mal den Vorschlag von Dukel. bearbeitet 23. April 2013 von lefg Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 (bearbeitet) Guten Morgen, Ich habe beide Varianten ausprobiert. Zu Powershell: Ich verstehe nicht wo in diesem Code der <tag> ausgewählt wird und in eine Datei geschrieben wird zudem erstellt keine Dateien... Der Name der Zieldateien ist erstmal egal. Hier mein Code: # Variablen $src = 'C:\Inhalt.xml' $dst = 'C:\' # In Xml konvertieren, welches die Powershell versteht: $xml = '<file>' $xml += Get-Content $src $xml += '</file>' $xml = [xml]$xml # Aufteilen und exportieren $xml.file.tag | % { $filename = $_.Name.replace('Tag','Ziel') $value = $_.OuterXml Set-Content -Value $value -Path "$dst\$filename.xml" } zu Batch: Sieht nicht schlecht aus,aber wie schreibe ich die gefunden tags nun in verschiedene Dateien? Was bedeutet "token=1 delims=<>" hier die Ausgabe im CMD: C:\>for /F "tokens=1 delims=<>" %i in (C " C:\>echo Tag name = "Tag1" | findstr "T Tag name = "Tag1" C:\>echo Modul name= "Modul1" | findstr C:\>echo Data name= "Data1" | findstr " C:\>echo /Modul | findstr "Tag" C:\>echo /Tag | findstr "Tag" /Tag C:\>echo Tag name = "Tag2" | findstr "T Tag name = "Tag2" C:\>echo Modul name= "Modul2" | findstr C:\>echo Data name= "Data2" | findstr " C:\>echo /Modul | findstr "Tag" C:\>echo /Tag | findstr "Tag" /Tag C:\>echo Tag name = "Tag3" | findstr "T Tag name = "Tag3" C:\>echo Modul name= "Modul3" | findstr C:\>echo Data name= "Data3" | findstr " C:\>echo /Modul | findstr "Tag" C:\>echo /Tag | findstr "Tag" /Tag C:\>pause Drücken Sie eine beliebige Taste . . . bearbeitet 24. April 2013 von tylerdurden666 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 Hast du das Script gespeichert und wolltest es ausführen und es kam ein Fehler wegen Execution Policy? Wenn ja, dann gib "Set-Executionpolicy RemoteSigned" in der Powershell ein. Guten Morgen, Ich habe beide Varianten ausprobiert. Zu Powershell: Ich verstehe nicht wo in diesem Code der <tag> ausgewählt wird und in eine Datei geschrieben wird zudem erstellt keine Dateien... Der Name der Zieldateien ist erstmal egal. Was kommt bei folgendem Heraus (Die Ausgabe für ein Dateien kommt dann als Text in der Powershell Konsole und wird nicht direkt geschrieben)? $src = 'C:\Inhalt.xml' $dst = 'C:\' # In Xml konvertieren, welches die Powershell versteht: $xml = '<file>' $xml += Get-Content $src $xml += '</file>' $xml = [xml]$xml # Aufteilen und exportieren $xml.file.tag | % { $filename = $_.Name.replace('Tag','Ziel') $value = $_.OuterXml #Set-Content -Value $value -Path "$dst\$filename.xml" "Filename: $dst\$filename.xml" "Inhalt: $value" } Das "Tag" holt er in der Zeile "$xml.file.tag | % {". Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 (bearbeitet) Die Powershell - Console schließt gleich wieder ( wie stoppe ich sie) Ich führe die Datei mit rechtsclick --- mit powershell ausführen aus. Das kommt als Fehlermeldung wenn ich sie in powershell.exe auführe: Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten. PS C:\Dokumente und Einstellungen\wolffst12> c: PS C:\Dokumente und Einstellungen\wolffst12> cd.. PS C:\Dokumente und Einstellungen> cd.. PS C:\> test.ps1 Die Benennung "test.ps1" wurde nicht als Name eines Cmdlet, einer Funktion, ein er Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Sc hreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wie derholen Sie den Vorgang. Bei Zeile:1 Zeichen:9 + test.ps1 <<<< + CategoryInfo : ObjectNotFound: (test.ps1:String) [], CommandNot FoundException + FullyQualifiedErrorId : CommandNotFoundException Suggestion [3,General]: Der Befehl test.ps1 wurde nicht gefunden. Er ist jedoch am aktuellen Ort vorhanden. Windows PowerShell lädt Befehle nicht standardmäßig vom aktuellen Ort. Wenn Sie diesem Befehl vertrauen, geben Sie stattdessen ".\te st.ps1" ein. Weitere Informationen erhalten Sie unter "get-help about_Command_Pr ecedence". PS C:\> bearbeitet 24. April 2013 von tylerdurden666 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 Starte Powershell aus dem Startmenü oder cmd und dann Powershell eingeben. Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 (bearbeitet) Okay, nun kommt folgende Meldung: PS C:\> .\test.ps1 Filename: C:\\Ziel1.xml Inhalt: <Tag name="Tag1"><Modul name="Modul1"><Data name="Data1"></Data></Modul ></Tag> Filename: C:\\Ziel2.xml Inhalt: <Tag name="Tag2"><Modul name="Modul2"><Data name="Data2"></Data></Modul ></Tag> Filename: C:\\Ziel3.xml Inhalt: <Tag name="Tag3"><Modul name="Modul3"><Data name="Data3"></Data></Modul ></Tag> PS C:\> bearbeitet 24. April 2013 von tylerdurden666 Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 (bearbeitet) zu Batch: Sieht nicht schlecht aus,aber wie schreibe ich die gefunden tags nun in verschiedene Dateien? for /f "tokens=2 delims=<>" %%i in (C:\Inhalt.txt) do echo %%i|findstr "Tag" >> c:\ziel.txt Was bedeutet "token=1 delims=<>" Die For-Schleife kann Zeilen in Blöcke, Token aufteilen, die Grenzen der Token werden mit Begrenzungen, Delimeter festgelegt; ein Default-Delimeter ist das Leerzeichen. Das ist alles in der Beschreibung von For erklärt. Was habe ich also gemacht? Ich habe die beiden fehlerverursachenden Steuerzeichen <> als Delimeter bestimmt. Die For-Schleife mit der Textauswertung ist nicht trivial in den Feinheiten und Kombination mit anderen Befehlen. Auch für mich ist das mit den Steuerzeichen für die Tags eine neue Erfahrung. bearbeitet 24. April 2013 von lefg Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 (bearbeitet) es wird nichts in die Datei ziel.xml geschrieben. hier die ausgabe im cmd: C:\>for /F "tokens=2 delims=<>" %i in (C:\Inhalt.xml) do echo %i | findstr "Tag " 1>c:\ziel.xml C:\>echo /Data | findstr "Tag" 1>c:\ziel.xml C:\>echo /Data | findstr "Tag" 1>c:\ziel.xml C:\>echo /Data | findstr "Tag" 1>c:\ziel.xml C:\>pause Drücken Sie eine beliebige Taste . . . bearbeitet 24. April 2013 von tylerdurden666 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 Okay, nun kommt folgende Meldung: PS C:\> .\test.ps1 Filename: C:\\Ziel1.xml Inhalt: <Tag name="Tag1"><Modul name="Modul1"><Data name="Data1"></Data></Modul ></Tag> Filename: C:\\Ziel2.xml Inhalt: <Tag name="Tag2"><Modul name="Modul2"><Data name="Data2"></Data></Modul ></Tag> Filename: C:\\Ziel3.xml Inhalt: <Tag name="Tag3"><Modul name="Modul3"><Data name="Data3"></Data></Modul ></Tag> PS C:\> Sieht gut aus. Jetzt kannst du das Orginal nehmen (oder die Zeile mit set-content auskommentieren). Bei $src = kannst du das \ weglassen, das wird immer (siehe "$dst\$filename.xml") hinzugefügt. Dann sollten die Dateien auch geschrieben werden. Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 sehr schön... Funktioniert soweit prima... Nun habe ich in der Inhalt.xml am Anfang noch dieses stehen: <?xml version="1.0" encoding="UTF-8"?> Damit geht der oben beschriebene Code nicht... Diese Textzeile soll auch in jede neue Datei am Anfang reingeschrieben werden. Wie mache ich das? Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 $value = '<?xml version="1.0" encoding="UTF-8"?>' $value += $_.OuterXml Set-Content -Value $value -Path "$dst\$filename.xml Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 (bearbeitet) nun kommt diese Fehlermeldung: PS C:\> .\test.ps1 Der Wert "<file><?xml version="1.0" encoding="UTF-8"?> <Tag name = "Tag1"> <Mod ul name= "Modul1"> <Data name= "Data1"></Data> </Modul> </Tag> <Tag name = "Tag 2"> <Modul name= "Modul2"> <Data name= "Data2"></Data> </Modul> </Tag> <Tag nam e = "Tag3"> <Modul name= "Modul3"> <Data name= "Data3"></Data> </Modul> </Tag>< /file>" kann nicht in den Typ "System.Xml.XmlDocument" konvertiert werden. Fehl er: "Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein. Davor sind keine Leerzeichen zulässig. Zeile 1, Position 9." Bei C:\test.ps1:8 Zeichen:17 + $xml = [xml]$xml <<<< + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen. Bei C:\test.ps1:12 Zeichen:32 + $filename = $_.Name.replace <<<< ('Tag','Ziel') + CategoryInfo : InvalidOperation: (replace:String) [], RuntimeEx ception + FullyQualifiedErrorId : InvokeMethodOnNull Filename: C:\.xml Inhalt: <?xml version="1.0" encoding="UTF-8"?> PS C:\> hier mein Code: $src = 'C:\Inhalt.xml' $dst = 'C:' # In Xml konvertieren, welches die Powershell versteht: $xml = '<file>' $xml += Get-Content $src $xml += '</file>' $xml = [xml]$xml # Aufteilen und exportieren $xml.file.tag | % { $filename = $_.Name.replace('Tag','Ziel') $value = '<?xml version="1.0" encoding="UTF-8"?>' $value += $_.OuterXml Set-Content -Value $value -Path "$dst\$filename.xml" "Filename: $dst\$filename.xml" "Inhalt: $value" } Und es wird nur eine .xml erstellt mit dem Inhalt : <?xml version="1.0" encoding="UTF-8"?> bearbeitet 24. April 2013 von tylerdurden666 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 Wie sieht deine gesamt XML Datei aus? Ich habe das Beispiel aus #13 genommen und dort fehlt <?xml version="1.0" encoding="UTF-8"?>. Das Problem ist, dass Powershell das XML validiert und ein XML mit mehreren Root Ordnern (die "tag's") nicht erlaubt ist. Daher das einfügen von mir von <file> und </file>. Zitieren Link zu diesem Kommentar
tylerdurden666 0 Geschrieben 24. April 2013 Autor Melden Teilen Geschrieben 24. April 2013 sie sieht so aus: <?xml version="1.0" encoding="UTF-8"?><Tag name = "Tag1"><Modul name= "Modul1"><Data name= "Data1"></Data></Modul></Tag><Tag name = "Tag2"><Modul name= "Modul2"><Data name= "Data2"></Data></Modul></Tag><Tag name = "Tag3"><Modul name= "Modul3"><Data name= "Data3"></Data></Modul></Tag> Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 24. April 2013 Melden Teilen Geschrieben 24. April 2013 (bearbeitet) Dann versuche folgendes (wenn es noch eine Leerzeile gibt dann -skip 2): $src = 'C:\Inhalt.xml' $dst = 'C:' # In Xml konvertieren, welches die Powershell versteht: $xml = '<file>' $xml += Get-Content $src | Select-Object -Skip 1 $xml += '</file>' $xml = [xml]$xml # Aufteilen und exportieren $xml.file.tag | % { $filename = $_.Name.replace('Tag','Ziel') $value = '<?xml version="1.0" encoding="UTF-8"?>' $value += $_.OuterXml Set-Content -Value $value -Path "$dst\$filename.xml" "Filename: $dst\$filename.xml" "Inhalt: $value" } bearbeitet 24. April 2013 von Dukel Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.