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-Key: 392497

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

Printed on: May 18, 2024 at 08:05 o'clock

Member: Kraemer
Kraemer Nov 12, 2018 updated at 15:58:35 (UTC)
Goto Top
Moin,


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

Gruß
Member: Pjordorf
Pjordorf Nov 12, 2018 at 16:00:20 (UTC)
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
Member: ITShark
ITShark Nov 12, 2018 at 16:06:05 (UTC)
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.
Member: rubberman
rubberman Nov 12, 2018 at 20:16:44 (UTC)
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
Mitglied: 77559
Solution 77559 Nov 12, 2018 at 21:54:02 (UTC)
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
Member: rubberman
Solution rubberman Nov 12, 2018 at 22:24:10 (UTC)
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
Member: ITShark
ITShark Nov 13, 2018 at 12:24:31 (UTC)
Goto Top
Perfekt, genau das habe ich gesucht als Basis!

Danke!
Member: ITShark
ITShark Nov 19, 2018 at 15:52:06 (UTC)
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?
Mitglied: 77559
77559 Nov 21, 2018 at 00:27:55 (UTC)
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