Batch Skript als Powershell Skript
Hallo Zusammen.
Ich dachte eigentlich das die Shell auch die Batch Commands versteht. Leider ist das aber nicht der Fall
echo "Client","Date","Time">test.csv
FOR /F "tokens=1,2,3,6 delims= " %%a IN ('type C:\win\bat\rsyncd.log^|findstr NBAPS^|findstr /V not^|findstr /V NBAPSV') DO @echo "%%d", %%a,"%%b">> C:\win\bat\test.csv
Wäre jemand so nett und könnte mir das auf die schnelle übersetzt? :D
Ich dachte eigentlich das die Shell auch die Batch Commands versteht. Leider ist das aber nicht der Fall
echo "Client","Date","Time">test.csv
FOR /F "tokens=1,2,3,6 delims= " %%a IN ('type C:\win\bat\rsyncd.log^|findstr NBAPS^|findstr /V not^|findstr /V NBAPSV') DO @echo "%%d", %%a,"%%b">> C:\win\bat\test.csv
Wäre jemand so nett und könnte mir das auf die schnelle übersetzt? :D
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 223080
Url: https://administrator.de/contentid/223080
Ausgedruckt am: 05.11.2024 um 00:11 Uhr
23 Kommentare
Neuester Kommentar
write-output '"Client","Date","Time"' | out-file -path .\test.csv -encoding ASCII
.\create_csv.bat
create_csv.bat:
@Echo off
SET logfile=test.log
SET outputfile=test.csv
SET searchstring=NBAPS
SET searchexclude=not
FOR /F "tokens=1-6 delims= " %%a IN ('type %logfile%^|findstr %searchstring%^|findstr /V %searchexclude%') DO (
@ECHO Rechner %%f gemeldet am %%a um %%b. %%c
@Echo "%%d",%%a;"%%b">>%outputfile%
)
Zitat von @Dpole86:
Ich weis passt zwar nicht zum thema, aber kann ich etwas was in der Pipe steht, zurück in eine Variable schreiben?
klarIch weis passt zwar nicht zum thema, aber kann ich etwas was in der Pipe steht, zurück in eine Variable schreiben?
$rsync_result = $csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group}
$rsync_result | export-csv -Path "C:\Temp\export.csv" -Delimiter "," -NoTypeInformation -Encoding UTF8
Schick mir mal nen Auschnitt aus dem Rsync-Log dann bau ich dir das direkt mit Powershell, ohne Umweg über Batch.
Uwe
Hier das äquivalente Script zum auslesen des Log-Files:
Grüße Uwe
$logfile = "C:\Temp\rsyncd.log"
$content = gc $logfile
$logins = @()
foreach($line in $content){
if ($line -cmatch "connect from NBAPS[\d]+"){
$arrLine = $line.Split(" ")
$logins += New-Object PSObject -Property @{"Client"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}
}
}
$rsync_result = $logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group} | select Client,Date,Time
$arrline
ist ein Array und mit der Nummer sprichst du jeweils die Array-Elemente an.HTML-Ausgabe nebeneinander:
$rsync_html = $rsync_result | ConvertTo-Html -Fragment
$spwo_html = $spwo_result | ConvertTo-Html -Fragment
$html = @"
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ausgabe</title>
</head>
<body>
<table border="0" width=""><tr><td>$($rsync_html)</td><td>$($spwo_html)</td></tr></table>
</body>
</html>
"@
$html | Out-File "C:\export.html"
@" "@
schon wieder für eine Schei..e ist . Dies ist ein sogenannter Here-StringGrüße Uwe
Hallo Roman,
ich glaube du verwechselst da was. Eine Hashtable ist so etwas:
während das hier ein Powershell-Array ist
und das hier macht aus der Hashtable ein Object mit Eigenschaften:
das dann so aussieht:
Möchtest du nun mehrere Objekte die die selben Eigenschaften besitzen zusammenfassen machst du das indem du die Hashtable's zu einem Array hinzufügst
wenn du dann das Array ausgibst sind alle Hashtable's zusammengefasst:
leider werden die Spalten dabei immer verkehrt herum angeordnet, das kannst du aber mit einem
Siehe dazu auch :http://blogs.msdn.com/b/powershell/archive/2009/12/05/new-object-psobje ...
Hoffe das war soweit klar ...
Grüße Uwe
p.s. suche bei deinen Recherchen nach Powershell mit Englisch, das bringt wesentlich mehr Treffer!
ich glaube du verwechselst da was. Eine Hashtable ist so etwas:
@{Key="Wert";Key2="Wert2";Key3="Wert3"}
@("Wert1","Wert2","Wert3")
#oder anstatt mit Strings kann dies auch Objekte enthalten
@($hashtable1,$hashtable2,$hashtable3)
Beispiel:
das ist eine Hashtable:Name Value
---- -----
Key1 Wert1
Key2 Wert2
$ht = @{Key1="Wert1";Key2="Wert2"}
New-Object PSObject -Property $ht
Key1 Key2
------- -------
Wert1 Wert2
Möchtest du nun mehrere Objekte die die selben Eigenschaften besitzen zusammenfassen machst du das indem du die Hashtable's zu einem Array hinzufügst
$ht1 = @{Key1="Mercedes";Key2="schwarz"}
$ht2 = @{Key1="VW";Key2="grün"}
$array = @()
$array += New-Object PSObject -Property $ht1
$array += New-Object PSObject -Property $ht2
$array
Key2 Key1
---- ----
schwarz Mercedes
grün VW
select
wieder beheben:$array | select Key1,Key2
Hoffe das war soweit klar ...
Grüße Uwe
p.s. suche bei deinen Recherchen nach Powershell mit Englisch, das bringt wesentlich mehr Treffer!
Dein "GesamtCode" in Kombination mit einem Auschnitt deiner originalen Log-Datei
Ich benutze den Powershell ISE (nur als Info)
dito PSVersion 3.0Ich habe mal wieder ein seltenes Problem -.-
nee, das Problem ist das du dir die Doku nicht reinziehst ...Das hier ist ja auch Quatsch und kann nicht funktionieren... du weißt ja keiner Variablen das Ergebnis zu sondern gibst es nur auf der Konsole aus.
Zitat von @Dpole86:
$logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-21)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} |
select Name,Date,Time
$Data_rsync = $logins
$logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-21)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} |
select Name,Date,Time
$Data_rsync = $logins
Dein zweiter Teil hier ist korrekt, das Ergebnis wird in $rsync_data gespeichert, wird aber nicht in der Console ausgegeben !
$rsync_data = $logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-21)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} | select Name,Date,Time
$rsync_data
Grüße Uwe