dpole86
Goto Top

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

Content-ID: 223080

Url: https://administrator.de/forum/batch-skript-als-powershell-skript-223080.html

Ausgedruckt am: 23.12.2024 um 11:12 Uhr

Snowman25
Lösung Snowman25 27.11.2013, aktualisiert am 05.12.2013 um 11:41:02 Uhr
Goto Top
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%  
)
Dpole86
Dpole86 27.11.2013 um 13:29:59 Uhr
Goto Top
Hi snowman und danke für deine Antwort face-smile

Ich weis passt zwar nicht zum thema, aber kann ich etwas was in der Pipe steht, zurück in eine Variable schreiben?

$csv = Import-CSV "C:\Users\admrd\Desktop\test\bat\test.csv" -Delimiter ","   
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group} 
$rsync_result=$csv
colinardo
Lösung colinardo 27.11.2013, aktualisiert am 05.12.2013 um 11:41:01 Uhr
Goto Top
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?
klar
$rsync_result = $csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group}
und wenn du das ganze dann wieder in eine CSV-Datei zurückschreiben willst machst du es dann so:
$rsync_result | export-csv -Path "C:\Temp\export.csv" -Delimiter "," -NoTypeInformation -Encoding UTF8  
aber warum das gedöns mit dem auslesen via Batch in Powershell ?
Schick mir mal nen Auschnitt aus dem Rsync-Log dann bau ich dir das direkt mit Powershell, ohne Umweg über Batch.
face-wink Uwe
Dpole86
Dpole86 28.11.2013 aktualisiert um 09:46:14 Uhr
Goto Top
Hi uwe und guten Morgen face-smile

Ok dann schicke ich dir mal ein Teil

Grüße und Danke Roman face-smile
colinardo
Lösung colinardo 28.11.2013, aktualisiert am 05.12.2013 um 11:40:59 Uhr
Goto Top
mach sofort die email aus deinem Post weg !!
Dpole86
Dpole86 28.11.2013 um 09:45:59 Uhr
Goto Top
tut mir leid...war echt keine absicht.
dachte ich habe das Posting noch nicht abgeschickt.
Mist.
colinardo
Lösung colinardo 28.11.2013, aktualisiert am 05.12.2013 um 11:40:58 Uhr
Goto Top
Hier das äquivalente Script zum auslesen des Log-Files:
$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
Grüße Uwe
Dpole86
Dpole86 28.11.2013 um 13:17:06 Uhr
Goto Top
Hi Uwe und Danke für das Script face-smile

mal wieder zur verständnis...was bedeuten die[1] etc hinter $arrline?
den rest versteh ich xD

ach und noch eine Frage

$Data += $rsync_result;
$Data += $spwo_result;

ich habe in der Hashtabelle $Data 2 resultate mit unterswchiedlichem content.

wie kriege ich es hin das er mir beide "werte" nebeneinander in einer csv und oder HTML ausgibt?

HTML ausgabe klappt soweit ganz gut allerdings nicht aus einer CSV sondern direkt aus den Daten heraus (aber auch nur jeweils 1 Tabelle)

also es sollte im Nachhinein einfach so aussehen

Auswertung Spiceworks Auswertung Rsync
name updated_on ID Client Date Time

also name, updated_on und ID in den ersten 3 spalten und Client Date und Time in den nächsten 3 Spalten.

Grüße Roman
colinardo
Lösung colinardo 28.11.2013, aktualisiert am 05.12.2013 um 11:40:56 Uhr
Goto Top
Zitat von @Dpole86:
mal wieder zur verständnis...was bedeuten die[1] etc hinter $arrline?
$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"  
Falls du dich jetzt wieder fragst was das @" "@ schon wieder für eine Schei..e ist face-wink. Dies ist ein sogenannter Here-String

Grüße Uwe
Dpole86
Dpole86 29.11.2013 um 10:11:45 Uhr
Goto Top
Guten Morgen uwe face-smile

Mal wieder ein dankeschön face-smile

Sag mal... ich habe zwar im netz gesucht aber nichts gefunden...
Wie kann ich die Werte aus der Hashtabelle in einzelne Spalten aufteilen?

Dann kann ich das Schöner in HTML Formatieren.

Grüße Roman
colinardo
Lösung colinardo 29.11.2013, aktualisiert am 05.12.2013 um 11:40:54 Uhr
Goto Top
Hallo Roman,
ich glaube du verwechselst da was. Eine Hashtable ist so etwas:
@{Key="Wert";Key2="Wert2";Key3="Wert3"}
während das hier ein Powershell-Array ist
@("Wert1","Wert2","Wert3")
#oder anstatt mit Strings kann dies auch Objekte enthalten
@($hashtable1,$hashtable2,$hashtable3)

back-to-topBeispiel:
das ist eine Hashtable:
Name        Value
----        -----
Key1        Wert1
Key2        Wert2
und das hier macht aus der Hashtable ein Object mit Eigenschaften:
$ht = @{Key1="Wert1";Key2="Wert2"}  
New-Object PSObject -Property $ht
das dann so aussieht:
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
wenn du dann das Array ausgibst sind alle Hashtable's zusammengefasst:
Key2       Key1    
----       ----    
schwarz    Mercedes
grün       VW     
leider werden die Spalten dabei immer verkehrt herum angeordnet, das kannst du aber mit einem select wieder beheben:
$array | select Key1,Key2
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!
Dpole86
Dpole86 29.11.2013 aktualisiert um 11:57:04 Uhr
Goto Top
Hi Uwe .. Ja das war mir verständlich allerdings bekomme ich aus dem Link von dir keine genaueren Informationen. Der code der dort abgebildet ist, ist irgendwie unverständlich für mich.

Dabei hast du das schon mal gemacht odeR?
und zwar mit diesem code.

Zitat von @colinardo:

Hier das äquivalente Script zum auslesen des Log-Files:

$logfile = "C:\Temp\rsyncd.log"
$content = gc $logfile

Hier deklarierst du eine Hashtabelle odeR?

$logins = @()

also dachte ich mir das ich den unten stehen code einfach kopieren kann?

foreach($line in $content){
if ($line -cmatch "connect from NBAPS[\d]+"){
$arrLine = $line.Split(" ")
$logins += New-Object PSObject -Property

Und hier dann @{"Client"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]} mach
zusammen mit @{"Client"=$arrLine[2];"updated_on"=$arrLine[3];"ID"=$arrLine[4]}

also Ich gehe davon aus, das du mit dem $arrline[2] die spalte "client" speicherst. ?
@{"Client"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}
}
}


Dementsprechend habe ich mir den Code dann so vorgestellt

 
 foreach($line in $rsync_result){     # ist ja eine Hashtable?
 $arrLine = $line.Split(" ")  
 $rsync_result += New-Object PSObject -Property
@{"Client"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}  


damit hätte ich dann die spalten Client Date und Time oder nicht?

und das dann in HTML:

 
$rsync1_html = $arrline[2] | ConvertTo-Html -Fragment


$html = @"  
    <!DOCTYPE HTML>
    <html>
    <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
<link rel="stylesheet" href="Scripts/menu_style.css" type="text/css" />  
<script type="text/javascript" src="Scripts/jsFlashVer.js"></script>  
<title> Auswertung </title>
</head>

    <body>
    <table width="1000" height="260" border="0" align="center">  
    <tr>
    <td>
    <div align="left">  
    <div align="left"><img src ="C:\Users\admrd\Desktop\test\bat\Logo\apsolut_Firmenlogo_Farbe.jpg"></div>  
    </td>
    </tr>
    </table>
    <table border="1" border-width: 1px;border-style: solid;border-color: orange;border-collapse: collapse;>  
    <tr><td>$($rsync1_html)</td></tr></table>
    </html>
"@  
$html | Out-File $Filename

Ich habe es nicht getestet nur ist das so meine Vorstellung.

Grüße Roman
Dpole86
Dpole86 04.12.2013 um 09:33:24 Uhr
Goto Top
Zitat von @colinardo:

Hier das äquivalente Script zum auslesen des Log-Files:
> $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
> 
Grüße Uwe


Hi Uwe

Ich habe dein Skript so wie es ist genommen und bei mir mit einer kleinen änderung getestet:
allerdings bekomme ich eine Endlosschleife des Prozesses?

mein Code lautet:

$logfile = "C:\Users\admrd\Desktop\test\bat\rsyncd.log"  
$content = gc $logfile
foreach($line in $content){
    if ($line -cmatch "connect from NBAPS[\d]+"){  
        $arrLine = $line.Split(" ")  
        $logins += New-Object PSObject -Property @{"Name"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}  
    }     
}
$Data_rsync | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} | select Name,Date,Time

Hast du ne idee wo derFehler liegt?

Grüße und Danke
Roman
colinardo
Lösung colinardo 04.12.2013, aktualisiert am 05.12.2013 um 11:40:45 Uhr
Goto Top
Dein Logfile ist ziemlich groß, über 100MB da kann das schon so einige Zeit dauern. Ich würde mal über ein Splitting des Logfiles nachdenken !!
Grüße Uwe
Dpole86
Dpole86 04.12.2013 um 09:49:33 Uhr
Goto Top
Zitat von @colinardo:

Dein Logfile ist ziemlich groß, über 100MB da kann das schon so einige Zeit dauern. Ich würde mal über ein
Splitting des Logfiles nachdenken !!
Grüße Uwe

Hi Uwe

Das Logfile ist 60 MB Groß

Das Programm allerdings hängt sich mit einer Auslastung von 2,3 GB auf oO
colinardo
Lösung colinardo 04.12.2013, aktualisiert am 05.12.2013 um 11:40:47 Uhr
Goto Top
wie gesagt,
Ich würde mal über ein Splitting des Logfiles nachdenken !!
Dpole86
Dpole86 05.12.2013 um 13:29:17 Uhr
Goto Top
Hi Uwe


du hattest recht es lag wirklich am Logfile.

Allerdings habe ich nun eine neue Frage.

Ich bekomme nicht mehr die einträge der Letzten 7 Tage sondern alle Einträge die Existieren.

$logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group} | select Client,Date,Time

Wenn ich die Daten aus $logins in $Rsync_result reinportiere ist $Data_rsync Leer oO

$rsync_result = $logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group} | select Client,Date,Time

GesamtCode
# Lese das Log ein, suche nach NBAPS und erstelle ein neues Objekt in $Data_rsync
 $logfile = "C:\Users\admrd\Desktop\test\bat\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 @{"Name"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}  
     }     
 }
$Data_rsync = $logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} | select Name,Date,Time


Danke schonmal im Vorraus face-smile
colinardo
colinardo 05.12.2013 aktualisiert um 14:30:16 Uhr
Goto Top
bei mir geht's einwandfrei ...
Dpole86
Dpole86 05.12.2013 um 14:32:25 Uhr
Goto Top
Und was geht bei dir Einwandfrei?

Ich benutze den Powershell ISE (nur als Info)

Ich bekomme zwar die einträge... Das ist auch nicht das Thema
ich bekomme nur nich die Einträge der letzten X-Tage

danke für deine Hilfe...
colinardo
Lösung colinardo 05.12.2013 aktualisiert um 14:44:49 Uhr
Goto Top
Zitat von @Dpole86:

Und was geht bei dir Einwandfrei?
Dein "GesamtCode" in Kombination mit einem Auschnitt deiner originalen Log-Datei
Ich benutze den Powershell ISE (nur als Info)
dito PSVersion 3.0
Dpole86
Dpole86 05.12.2013 um 14:44:45 Uhr
Goto Top
Hi Sorry mein Fehler

der Letzte Eintrag im Log ist vom 26.10.2013

wenn ich nun 05.12.2013 -7 tage mach komm ich auf den 28\29

da es in dem Fall keine Daten gibt ist auch die Variable Leer.

Danke face-smile
Dpole86
Dpole86 06.12.2013 um 14:23:56 Uhr
Goto Top
Hi Uwe

Ich habe mal wieder ein seltenes Problem -.-

bei dem code

 
 $logfile = "C:\Users\admrd\Desktop\test\bat\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 @{"Name"=$arrLine[5];"Date"=$arrLine;"Time"=$arrLine[1]}  
     }     
 }

$logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-21)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} | select Name,Date,Time

$Data_rsync = $logins 

Wenn ich die Variable $logins pipe, bekomme ich das Ergebniss.

Allerdings ist das Ergebniss nicht von dauer
den sobald ich nur die Variable ausgebe, bekomme ich die gesamte liste...

auch ein
$rsync_data = $logins | ?{(get-date $_.Date) -gt (get-date).AddDays(-21)} | sort Name,Date,Time -Descending | group Name | %{$_.Group} | select Name,Date,Time
bringt nicht das ergebniss aus der Pipe.

wo ist der Fehler?
colinardo
Lösung colinardo 06.12.2013, aktualisiert am 09.12.2013 um 09:56:56 Uhr
Goto Top
Ich 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


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
dazu musst du die Variable explizit auf der Konsole mit
$rsync_data
ausgeben ... dann werden die Daten auch auf dem Bildschirm erscheinen

Grüße Uwe