Aus einer CMD-Datei weitere Datei erstellen

dinoldo

Cadet 4th Year
Registriert
Juni 2017
Beiträge
104
Hallo Leute,

ich habe n einer bestehender CMD-Datei diesen Inhalt eingefügt, welches eine Datei "configuration.xml" anlegen soll.

....
Code:
>"configuration.xml" (
    echo <?xml version="1.0" encoding="utf-16"?>
    echo <ArrayOfConfigurationModel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    echo   <ConfigurationModel>
    echo     <Title>ROM</Title>
    echo     <Description />
    echo     <ConfigurationVariable>_USTN_CUSTOM_CONFIGURATION</ConfigurationVariable>
    echo     <Type>Network</Type>
    echo     <IsActive>true</IsActive>
    echo     <Path>P:/CADTRONIC/%standort%/Configuration/</Path>
    echo     <IsSelected>true</IsSelected>
    echo     <IsEditable>false</IsEditable>
    echo   </ConfigurationModel>
    echo </ArrayOfConfigurationModel>
)
....

Das hat leider nicht funktioniert. Woran liegt das bitte - muss ich bestimmte Inhalte / Zeichen maskieren?

Beste Grüße,
Dino
 
Zuletzt bearbeitet:
dinoldo schrieb:
Das hat leider nicht funktioniert.
Aha. Das ist wenig hilfreich, weil mir spontan verschiedene Ausprägungen von "Funktioniert nicht" in den Sinn kommen.

1. Batch meldet einen Syntax-Fehler
2. Text wird nicht vollständig geschrieben
3. Datei wird gar nicht geschrieben

Wenn ich noch einen Moment nachdenke, fällt mir sicher noch mehr ein. Drücke dich also bitte genauer aus, weil man dir sonst nicht helfen kann.
Ergänzung ()

Grundsätzlich sind < und > natürlich Kommandozeichen - sogenannte redirects - die du mit >> ja selbst benutzt. Mindestens diese müssen innerhalb des Texts daher mit ^> escaped werden. Weitere special characters findest du hier.

Abgesehen davon hast du deinen Beitrag gerade editiert, was natürlich echt super ist, wenn man dir gerade antwortet. Das ist mir ehrlich gesagt zu doof, weil ich noch im Bett liege, nur mit dem Handy antworte und jetzt keine Lust habe, deinen Code nochmal zu checken. Nimm daher erstmal den Hinweis mit den Sonderzeichen und wenn du Glück hast, ist der Rest, den ich noch schreiben wollte, nach deinem Edit hinfällig.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Innensechskant, dinoldo, rg88 und 4 andere
Statt eine Datei zu schreiben, die bis auf exakt 1 Stelle statischer Inhalt ist, schreibe die gesamte Datei als Template mit einem sinnvollen Platzhalter und ersetze diesen zur Laufzeit mit dem dynamischen Wert.

Das ist signifikant weniger fehleranfällig und sehr viel besser zu warten.
 
  • Gefällt mir
Reaktionen: dinoldo
Geht mit ewas for-Loop-Foo auch ohne Escapes. Nutze das immer für exotische 'Echo' Writes :).

Alles unterhalb von ::StartOff wird in die Datei geschrieben.

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
::===============================================================================================================
for /f "delims=[]" %%a in ('find /n "::StartOf"^<"%~f0"') do more +%%a "%~f0" 1>configuration.xml
endlocal
exit
::===============================================================================================================
::StartOff
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfConfigurationModel xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ConfigurationModel>
    <Title>ROM</Title>
    <Description />
    <ConfigurationVariable>_USTN_CUSTOM_CONFIGURATION</ConfigurationVariable>
    <Type>Network</Type>
    <IsActive>true</IsActive>
    <Path>P:/CADTRONIC/%standort%/Configuration/</Path>
    <IsSelected>true</IsSelected>
    <IsEditable>false</IsEditable>
  </ConfigurationModel>
</ArrayOfConfigurationModel>
 
Generell wäre natürlich auch der Kontext des Ganzen von Interesse. Mit PowerShell ließe sich das beispielsweise mit einem OneLiner regeln:

Code:
((Get-Content -path C:\irgendwo\baseconfig.xml -Raw) -replace 'alt','neu') | Set-Content -Path C:\irgendwo\configuration.xml

PowerShell Kommandos / Skripte kann man auch aus Batch-Dateien aufrufen. Generell ist PowerShell aber die deutlich bessere Umgebung für Windows Skripte. Batch is a bitch und das bezieht sich nicht nur auf Sonderzeichen, sondern das ganze Konzept wie zB auch die Erweiterung von Variablen mit %bla% vs !bla! und der ganze Rotz. "Batch" ist ein Antonym von "intuitiv".
 
  • Gefällt mir
Reaktionen: Innensechskant und bezelbube
@Raijin ist schon richtig. Aber einem User der hier schon überfordert ist noch Powershell zu empfehlen, ist auch nicht wirklich zielführend :).

Der for-Loop in meinem Beispiel ist schmutzig aber effektiv. Der schreibt alles ohne Escapes in die Datei, direkt aus der CMD, ohne Ursprungs-XML. Nutze den auch für schwierige Fälle.

Nutze auch Powershell und VB-Code via CMD als Bastard-Hybrid-Lösung :).
 
mae1cum77 schrieb:
Aber einem User der hier schon überfordert ist noch Powershell zu empfehlen, ist auch nicht wirklich zielführend :).
Bisher heißt es nur "funktioniert nicht". Von einer Überforderung kann ich da noch nichts erkennen, außer vielleicht einer Überforderung, das Problem ausreichend zu beschreiben. ;)

Mir ging es bei dem Beispiel aber auch nicht speziell um PowerShell, sondern eher darum, dass das Code-Schnipsel aus dem Kontext gerissen wirkt. Wenn's ganz dumm läuft, liegt gar ein XY-Problem vor und wir machen uns Gedanken über eine Lösung für das falsche Problem.


@dinoldo : Na dann ist ja alles gut ;)
 
  • Gefällt mir
Reaktionen: Iqra und dinoldo
Raijin schrieb:
Bisher heißt es nur "funktioniert nicht".
Wer minimal Plan von CMD hat, konnte das sofort erkennen. Wenn ich da eine Möglichkeit kenne, das nervige Escapen (für: <>,(),!,? usw.) zu umgehen, biete ich die an.
 
mae1cum77 schrieb:
Wenn ich da eine Möglichkeit kenne, das nervige Escapen (für: <>,(),!,? usw.) zu umgehen, biete ich die an.
Du meinst eine Möglichkeit wie zB PowerShell? :D


Wenn man eh eine Skriptsprache lernen muss, spielt es vom KnowHow her doch keine Rolle welche es ist. Der Unterschied zwischen Batch und PowerShell ist jedoch, das sich letzteres an gängige Konzepte von Programmiersprachen hält, während Batch mehr Ausnahmen als Regeln beinhaltet. Allein die Notwendigkeit unserer Lösungen spricht doch Bände. :(

Wie auch immer, Happy Hallo... ach ne... Frohe Weihnachten!!!! :jumpin::schluck::cheerlead:🥳🎅
 
  • Gefällt mir
Reaktionen: Innensechskant
Nur ergänzend zu @Raijin s Beitrag: mit PS und XML nimmt man idealerweise kein get-content und -replace, wie für plaintext, sondern man nutzt die Zugriffsmöglichkeiten die XML einem bietet. Das sorgt dafür, dass alles was man macht weiterhin gültiges XML beläßt und viel wichtiger, daß man exakt die Daten modifiziert die man modifizieren wollte. XML ist nun mal strukturiert, auch wenn es auch als unstrukturierter Text betrachtet werden kann.


Aber, ja, batch ist effektiv tot, bevor man da Zeit investiert, lieber möglichst bald auf ps umschwenken.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau und Raijin
Nur mal exemplarisch, wie man es machen könnte:

PowerShell:
$Quelldatei = "C:\Test.xml"
$Zieldatei = "C:\Test.csv"
$xml = New-Object XML
$xml.Load($Quelldatei)
$xml.Root.Items.Item | Export-CSV $Zieldatei -Delimiter ";" -NoType -Encoding UTF8
 
Zurück
Oben