goooly
Goto Top

Auf der (Win7,64) Konsole xml-Dateien aus einer komplexen Ordnerstruktur in ein Verzeichnis zu kopieren

Hi,
I muss/will alle xml-Dateien (es gibt kkeine anderen) aus einer Verzeichnisstruktur in einem einzigen Verzeichnis kopieren.
Am liebsten dann auch gleich bei jeder Datei mit Regex den xml-code entfernen (<.+?>).
(der Grund ist, dass ich den reinen Text in einen Editor mit Rechtschreibprüfung laden will, um ihn zu kontrollieren)

Das Kopieren versuchte ich mit:
set "quelle=C:\Users\ich\Documents\Wurzel_XML"
set "ziel=C:\Users\ich\Documents\Alle_XML"

FOR /F "delims=" %%i in ('dir /b /s /aa "%quelle%"') do copy "%%i" "%ziel%"


Aber 1.) : "%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Und 2.): Geht Regex in der Konsole überhaupt?

Mein Umgang mit der Konsole ist halt schon seeeehr lange her face-sad
Vielen Dank!

Content-Key: 363066

Url: https://administrator.de/contentid/363066

Printed on: April 25, 2024 at 07:04 o'clock

Mitglied: 135333
135333 Jan 31, 2018 updated at 11:08:59 (UTC)
Goto Top
Nimm besser gleich die Powershell.
function Copy-Flat([string]$source,[string]$destination,[string[]]$Filefilter){
    gci $source -Include $FileFilter -Recurse | %{
        $dest = "$destination\$($_.Name)";$cnt = 1  
        while(Test-Path $dest){$dest = "$destination\$($_.Basename)($cnt)$($_.Extension)"; $cnt++}  
        ([xml](gc $_.Fullname)).InnerText | sc $dest
    }
}
Copy-Flat -source 'C:\Users\ich\Documents\Wurzel_XML' -destination 'C:\Users\ich\Documents\Alle_XML' -Filefilter '*.xml'  
Gruß snap
Member: Kraemer
Solution Kraemer Jan 31, 2018 updated at 11:42:28 (UTC)
Goto Top
Ich bin auch bei Powershell - fand die Aufgabenstellung witzig.

Wenn ein Microsoft Word installiert ist, macht folgendes Script genau das, was du willst und sortiert die Dateien automatisch in zwei verschiedene Verzeichnisse (Rechtschreibung OK oder nicht).

Gruß

$SearchPath="C:\temp\PS-SpellingChecker\"  
$OKPath="C:\Temp\PS-SpellingChecker\OK"  
$FalsePath="C:\Temp\PS-SpellingChecker\Fehler"  

$WordApp = New-Object -com Word.Application
Get-ChildItem -Filter *.xml -path $SearchPath | %{
    $XmlDoc = Get-Content $_.Name
    $XmlDoc = $XmlDoc -replace "(<.+?>)"  
    Out-File -FilePath $_ -InputObject $XmlDoc

    if ($WordApp.CheckSpelling($XmlDoc) -eq $true){
        Move-Item -Path $_ -Destination $OKPath
    }
    else {
        Move-Item -Path $_ -Destination $FalsePath
    }
}

Edit: vergessenes Out-File nachgereicht
Member: goooly
goooly Feb 02, 2018 updated at 12:43:24 (UTC)
Goto Top
Hi,
ich hab inzwischen selber eine PowerSell-Lösung entwickelt, ich will den reinen Text lesen und korrigieren: Stil, Rechtschreibung, Bezüge,... :
1) alte Dateien entfernen,
2) kopieren,
3) ins Verzeichnis wechseln,
4) XML-code entfernen, bisschen 'was ersetzten und Leerzeilen entfernen,
5) Datei-Endung tauschen (xml-txt) damit der Editor sich nicht auf den falschen Dampfer setzt:

# set the dirs:
cls
$Target = "C:\Users\..."  
$chkXML = "C:\Users\...\checkXML"  

# remove prev. files:
Remove-Item "$chkXML\*" -Recurse -Force  

# copy  in \checkXML\
Get-ChildItem -Path $Target -Recurse |
    Where-Object Name -like "*.xml" |   
    Copy-Item -Destination $chkXML

# move to the folder
cd $chkXML

# now remove xml-code from all files and eliminate empty lines replace some other stuff
foreach ($file in Get-ChildItem $chkXML) {
    (Get-Content -Path $file) |
        ForEach-Object {$_ -replace "&quot;", """" } |    
        ForEach-Object {$_ -replace "&lt;", "<" } |  # &lt;br14/&gt; => Wobei:<br14/>  
        ForEach-Object {$_ -replace "&gt;", ">" } |  # &lt;br14/&gt;  
        
        ForEach-Object {$_ -replace "<[^>]*>", "" } |   # removes xml-code  
        ? {$_.trimStart() } |                           # initial blanks
        ? {$_.trim() -ne "" } |                         # removes empty lines  
        Set-Content -Path $file
} 

# rename the files so that the editor doesn't get the wrong impression 
Dir *.XML | rename-item -newname { [io.path]::ChangeExtension($_.name, "txt") }  
cd c:\

Das funktioniert ganz gut!