nagus
Goto Top

Alle Dateien in einem Verzeichnis zeilenweise auslesen

Hi zusammen,

da ich schon eine Weile nix mehr im Batch gemacht habe bin ich ein wenig raus und stehe auf dem Schlauch:

Ich habe ein Verzeichnis mit X CSV Dateien. Es handelt sich um eine Auswertung aus dem AD für Softwaregruppen. Die ersten drei Zeilen in den CSV Dateien sind immer irrelevant. Ich möchte nun alle Dateien Zeilenweise in eine neue Datei schreiben.

for /f "usebackq skip=3 " %%i in (c:\Auswertung\20180409_1227\dateiname.csv) do echo %%i   

Außerdem möchte ich die Anzahl der gelesenen Zeilen zählen und zusammen mit dem Dateinamen der verarbeiteten Datei in eine neue Datei schreiben.

Zähler vermutlich so
set/A count=%count%+1


for /f "usebackq skip=3 " %%i in (c:\Auswertung\20180409_1227\dateiname.csv) do echo %%i >>Dateiname2.csv && set/A "count=%count%+1"  

funktioniert aber nicht und ich stehe gerade auf dem Schlauch ..

Einfach die Zeilen per PS zählen funktioniert auch nicht, weil auch leere Zeilen am Ende gezählt werden.
(get-content 'C:\Users\XXX\Desktop\PowerShellScripte\Auswertung\20180409_1227\_XXXXXX2013.csv').Count  
Und wenn ich einen Platzhalter angebe, erhalte ich die gesamt Zahl der Zeilen, was mir nicht hilft.


Hilfe ... face-sad

Content-ID: 370536

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

135799
Lösung 135799 09.04.2018 aktualisiert um 16:06:59 Uhr
Goto Top
Powershell
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{gc $_.Fullname | select -skip 3} | ?{$_ -notmatch "^\s*$"} | sc 'c:\gesamt.csv'  
Und
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count) : $($_.Name)"} | sc 'c:\Auswertung.csv'  
Gruß schnuffi
NetzwerkDude
NetzwerkDude 09.04.2018 aktualisiert um 16:24:31 Uhr
Goto Top
Thema einlesen:
Für CSVs gibts ein extra cmdlet: Import-Csv
z.B. sowas:
Import-Csv -Path .\input.csv -Delimiter ";"  | Select-Object -Skip 3  

Thema zählen:
Bei mir zählt er keine "leeren" - aber falls doch, kannst du da z.B sagen er soll nur bestimmte Zeilen zählen:
$Inhalt = Import-Csv -Path .\input.csv -Delimiter ";"  | Select-Object -Skip 3  
$ZeilenAnzahl = ($Inhalt | Where-Object "Test").count  
--> werden nur objekte geliefert, deren eigenschaft "Test" etwas enthält (Test = eine Überschrift in der CSV)

Nun, natürlich jetzt noch alles in eine Schleife verpacken
Nagus
Nagus 09.04.2018 um 16:29:53 Uhr
Goto Top
Hey super! Danke!!

Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count) : $($_.Name)"} | sc 'c:\Auswertung.csv'  
funktioniert.

Wie drehe ich aber die Ausgabe um: erst den Dateinamen und dann die Anzahl der Zeilen?

So??
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$((gc $_.Fullname | select -skip 3 | ?$($_.Name) : {$_ -notmatch "^\s*$"}).Count) "} | sc 'c:\Auswertung.csv'  
Nagus
Nagus 09.04.2018 um 16:32:35 Uhr
Goto Top
Danke Dude

Das muss ich mir noch einmal in Ruhe ansehen und versuchen zu verstehen. Passt im Moment nicht so gut, da ich nur eine Spalte befüllt habe (die CSV Dateien habe ich vorher aus einem anderem Script erstellt)

Da ich mich erst seit zwei Tagen mit PS beschäftige, dauert das wohl noch ein wenig ... -.-
135799
135799 09.04.2018 aktualisiert um 16:37:45 Uhr
Goto Top
Zitat von @Nagus:
Wie drehe ich aber die Ausgabe um: erst den Dateinamen und dann die Anzahl der Zeilen?

So??
So ...
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$($_.Name) : $((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count)"} | sc 'c:\Auswertung.csv'  
Nagus
Nagus 09.04.2018 aktualisiert um 17:34:39 Uhr
Goto Top
Ahh ... okay ...
an der PS Console läuft es. Im script fällt es aber immer auf die Schnauze ....

set "runtime=%date:~6,4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%"  
set "pfad=%~dp0Auswertung"  
set "Steuerdatei=%pfad%\software_gruppen.csv"  

echo %runtime%
echo %pfad%\%runtime%
echo %steuerdatei%
md %pfad%\%runtime%

PowerShell.exe -ExecutionPolicy Bypass -Command "Get-ADGroup -Filter \"name -like '_Software*'\" | select -exp name" > %pfad%\software_gruppen.csv  

for /F %%i in  (%steuerdatei%) do PowerShell.exe -ExecutionPolicy Bypass -Command "get-adgroupmember %%i | select-object name" >> "%pfad%\%runtime%\%%i.csv"  

powershell.exe Gci '%pfad%\%runtime%' -Filter *.csv | %{"$($_.Name) : $((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count)"} | sc '%pfad%\Auswertung.csv'  

Ich vermute das mir ein paar " " fehlen ... aber ich finde nicht wo ...

Fehlermeldung:
Der Befehl "$" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
135799
135799 09.04.2018 aktualisiert um 17:39:38 Uhr
Goto Top
Kein wunder, da is ne Menge falsch ... vollkommen unausgeglichene Anführungszeichen intern nicht escaped und die Prozentzeichen für die Schleife nicht verdoppelt.

Denke immer daran du bist hier in einer Batchdatei bei der Sonderzeichen wie % escaped werden müssen sofern sie im Powershell-Teil vorkommen!

powershell.exe -Exe ByPass -C "Gci '%pfad%\%runtime%' -Filter *.csv | %%{\"$($_.Name) : $((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch '^\s*$'}).Count)\"} | sc '%pfad%\Auswertung.csv'"  
http://www.robvanderwoude.com/escapechars.php
135799
135799 09.04.2018 aktualisiert um 17:42:46 Uhr
Goto Top
p.s. was soll der Mischmasch?? Wenn du doch schon die Powershell nutzt mach es doch gleich ganz damit! Batch hat ausgedient wenn du damit arbeitest!
Nagus
Nagus 09.04.2018 um 17:49:14 Uhr
Goto Top
Naja - ich bin erst seit zwei Tagen in Kontakt mit der PS ... bisher habe ich alles im Batch gemacht ...

warum powershell -Exe ByPass -C ?

jetzt bringt er den Fehler:
Der Befehl "select" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Friemler
Friemler 09.04.2018 um 19:07:27 Uhr
Goto Top
Hallo,

falls es doch lieber Batchscript sein soll:
@echo off & setlocal

set "SrcDir=."  
set "DstFile=.\Output\Result.csv"  
set "LogFile=.\Logfile.log"  

type NUL > "%DstFile%"  

> "%LogFile%" (  
  for %%a in ("%SrcDir%\*.csv") do (  
    set /a Cnt=0

    >> "%DstFile%" (  
      for /f "usebackq skip=3 tokens=* delims=" %%b in ("%%~a") do (  
        echo %%b
        set /a Cnt+=1
      )
    )

    setlocal enabledelayedexpansion
    echo %%~a: !Cnt! Zeilen geschrieben
    endlocal
  )
)

Gruß
Friemler
Nagus
Nagus 11.04.2018 um 18:02:04 Uhr
Goto Top
Hi Friemler,
Danke für den code. Bin gerade am testen, allerdings sieht es so aus, als ob er den ganzen code in die Result.csv schreibt
VG
Nagsu
Friemler
Friemler 11.04.2018 aktualisiert um 19:00:07 Uhr
Goto Top
Hallo Nagus,

Zitat von @Nagus:

... allerdings sieht es so aus, als ob er den ganzen code in die Result.csv schreibt

ja klar, ich habe die Aufgabe so verstanden. Was soll denn stattdessen passieren bzw. wie ist die Regel, nach der aus dem Namen einer Ausgangsdatei der Name einer Ergebnisdatei erzeugt werden soll?

Grüße
Friemler
Nagus
Nagus 12.04.2018 um 17:51:09 Uhr
Goto Top
Die CSV Dateien in dem Verzeichnis, sind Auswertungen aus dem AD für die SW Zuweisung. Da stehen die Computernamen drinnen. Ich brauche jetzt die Übersicht, wieviele Zeilen in jeder Datei stehen = Anzahl der zugewiesenen Lizenzen.
Die Auswertung aus dem AD habe ich bereits. Jetzt geht es nur noch um die Übersichtsdatei.

die CSV Dateien sind in der Form _software_MicrosoftRepairWSUSClient.csv benannt


Der Aufbau der CSV ist wie folgt:

name       
----       
HOSTNAME N
HOSTNAME N+1

deswegen sollen bei der Zählung die ersten drei Zeilen übersprungen werden und nur die Zeilen mit Inhalt gezählt werden. Das PS Script für die Erstellung schießt leider auch Leerzeilen in die Dateien - Schema konnte ich nicht nachvollziehen.
Friemler
Friemler 12.04.2018 aktualisiert um 19:53:28 Uhr
Goto Top
Zu viele Details und ich weiß immer noch genauso viel/wenig wie vorher. Bitte halte Dir vor Augen, dass ich nichts über Deine Problemstellung und was mit der/den erzeugten Datei(en) passieren soll weiß und entsprechend keine Rückschlüsse ziehen kann, was zu tun ist.

Du musst mir einfach mal genau erklären, welche Daten wohin geschrieben werden sollen. Dass der Inhalt aller CSV-Dateien (außer den ersten drei Zeilen) in einer einzigen CSV-Datei landet entspricht wohl nicht Deiner Anforderung. Was dann?

  1. Eine CSV-Datei, die in der ersten Spalte den Namen einer Auswertungsdatei enthält und in der zweiten Spalte deren Zeilenanzahl minus 3.
  2. Eine CSV-Datei, die blockweise aufgebaut ist:
    1. Name einer Auswertungsdatei
    2. Darunter alle Zeilen dieser Datei (bis auf die ersten 3)
  3. Für jede Auswertungsdatei eine neue CSV-Datei (wie soll deren Name generiert werden?), die alle Zeilen der Auswertungsdatei enthält (bis auf die ersten 3).
  4. ...

Grüße
Friemler