itshark
Goto Top

CMD BAT Dateien verarbeiten

Hallo zusammen,

folgendes Problem bzw. folgende Herausforderung habe ich.

Ich habe ca. 2000 TXT Dateien welche ich zusammenführen will.
Jede Datei setzt sich im Dateinamen wie folgt zusammen %USERNAME%_%HOSTENAME%.txt und beinhaltet eine Liste von Netzwerkdruckern.

Jetzt möchte ich natürlich nicht 2000 Dateien Stück für Stück analysieren sonder will alle in eine Datei zusammenführen.

Wie bekomme ich den Dateinamen (bzw. 2000) in eine neue Textdatei?
Des Weiteren soll nicht nur der Dateiname, sondern auch der Inhalt bzw. der Druckername mitgenommen werden.

Bsp.:

Max_PC1.TXT
Peter_PC2.TXT

--> Neue Datei (Name egal) mit Inhalt:

Max_PC \\Druckserver\Drucker1
Peter_PC2 \\Druckserver\Drucker2

Hoffe es ist verständlich beschrieben.

Viele Grüße,
Olli

Content-ID: 392497

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

Ausgedruckt am: 26.11.2024 um 02:11 Uhr

Kraemer
Kraemer 12.11.2018 aktualisiert um 16:58:35 Uhr
Goto Top
Moin,


Zitat von @ITShark:
Hoffe es ist verständlich beschrieben.
mangels vollständiger™ Beispiele: nein!

Gruß
Pjordorf
Pjordorf 12.11.2018 um 17:00:20 Uhr
Goto Top
Hallo,

Zitat von @ITShark:
Ich habe ca. 2000 TXT Dateien welche ich zusammenführen will.
In einer CMD dann copy /b Datei.txt+Datei2.txt+Datei3.txt ... +Datei2000.txt DateiZiel.txt

Gruß,
Peter
ITShark
ITShark 12.11.2018 um 17:06:05 Uhr
Goto Top
Dann noch einmal mehr im Detail. In dem Fall mit nur 2 Dateien:

Datei 1: Max_PC1.txt
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices
    \\Prinserver1\PRT1    REG_SZ    winspool,Ne04:

Suchvorgang abgeschlossen: 1 übereinstimmende Zeichenfolge(n) gefunden.

Datei 2: Peter_PC2.txt
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices
    \\Prinserver1\PRT121    REG_SZ    winspool,Ne04:

Suchvorgang abgeschlossen: 1 übereinstimmende Zeichenfolge(n) gefunden.

Da ich nicht jeder der 2000 Dateien manuell machen will, würde ich diese gerne in eine Datei zusammenführen, so dass am Ende etwas rauskommt wie:

Datei_Neu.txt
Max_PC1 \\Prinserver1\PRT1
Peter_PC2 \\Prinserver1\PRT121

Muss halt irgendwie in eine Schleife die jede Datei nimmt, den Dateinamen in eine neue packt und via findstr nur den Printserverteil, der immer gleich ist, dranhängt.
rubberman
rubberman 12.11.2018 um 21:16:44 Uhr
Goto Top
Irgendwas in der Art, schätze ich.
@echo off &setlocal
>"Datei_Neu.txt" (for /f "delims=" %%i in ('dir /a-d /b *.txt') do for /f %%j in ('findstr "\\\\\\\\" "%%~i"') do echo %%~ni %%j)  
Grüße
Steffen
77559
Lösung 77559 12.11.2018 um 22:54:02 Uhr
Goto Top
Hallo Steffen,

sollten das nicht 4 backslash sein anstatt 8?

Ich würde ja hier eher zu PowerShell greifen:

## Q:\Test\2018\11\12\AD_392497.ps1
$Data = Get-ChildItem *_*.txt| ForEach-Object {
  $User,$Comp = $_.BaseName.split('_.')[0,1]  
  Select-String -Path $_.FullName -Pattern '\\\\' | ForEach-Object {  
    [PSCustomObject]@{
      User     = $User
      Computer = $Comp
      Printer  = ($_.Line -split ' +')[1]  
    }
  }
}
$Data
$Data | Export-Csv .\UserComputerPrinterList.csv -NoTypeInformation

Mit dieser Ausgabe (resp in einer .csv Datei)

User  Computer Printer
----  -------- -------
Max   PC1      \\Prinserver1\PRT1
Peter PC2      \\Prinserver1\PRT121
rubberman
Lösung rubberman 12.11.2018 um 23:24:10 Uhr
Goto Top
Hallo LotPings
lange nicht mehr gelesen face-wink

Zitat von @77559:
sollten das nicht 4 backslash sein anstatt 8?
Dachte ich auch erst, matcht dann aber auch die einfachen Backslashes in der ersten Zeile. FINDSTR ist verbugt und vermutlich kommt hier noch hinzu, dass es innerhalb der FOR /F Schleife in einer additionellen cmd Instanz im Kommandozeilenmodus ausgeführt wird. FIND wäre vermutlich einfacher zu verstehen gewesen, à la
... in ('^<"%%~i" find "\\"') do ...

Grüße
Steffen
ITShark
ITShark 13.11.2018 um 13:24:31 Uhr
Goto Top
Perfekt, genau das habe ich gesucht als Basis!

Danke!
ITShark
ITShark 19.11.2018 um 16:52:06 Uhr
Goto Top
Eine kleine Sache noch:

Wenn meine Ausgabe wie folgt aussieht ...

Device     REG_SZ     \\Prinserver1\PRT1   

wie muss ich den Select-String anpassen, dass ich nur \\Printserver\PTR1 bekomme?
77559
77559 21.11.2018 um 01:27:55 Uhr
Goto Top
Hallo ITShark,

das Pattern mit Capture Group und die Ausgabe derselben sieht dann ganz anders aus:

## Q:\Test\2018\11\12\AD_392497.ps1
$Data = Get-ChildItem *_*.txt| ForEach-Object {
  $User,$Comp = $_.BaseName.split('_.')[0,1]  
  Select-String -Path $_.FullName -Pattern '(\\\\.*?)(?=( |$))' | ForEach-Object {  
    [PSCustomObject]@{
      User     = $User
      Computer = $Comp
      Printer  = $_.Matches.Groups[1].Value
    }
  }
}
$Data
$Data | Export-Csv .\UserComputerPrinterList.csv -NoTypeInformation

Die RegEx nutzt einen positiven lookahead und nimmt den Text zwischen einem doppelten backslash und dem ersten Leerzeichen oder dem Zeilenende