b2kbutt
Goto Top

Ordnernamen in Variable schreiben

Moin

Ich weiß, wer sich den Titel durchliest, wird sich denken, dass es doch schon etliche Themen dazu gibt, aber ich komm mit den genannten Lösungen einfach nicht zur Lösung meines Problems:

Die Batch die ich schreibe, soll Teil einer Art "Diagnose" werden. Hierzu müssen vom "Server" aus auf mehreren "Clients" Dienste gestartet werden.
Da die Diagnose in mehreren Netzwerken zum Einsatz kommen soll, hab ich das Problem das die Rechnernamen der Clients immer anders sind.
Jedoch schreibt mir ein Progamm, das im Netzwerk verwendet wird, die Computernamen der Clients die ich benötige als Unterordner in einen festgelegten Ordner auf dem Server.

Nun meine Frage:

Wie kann erstens die Anzahl der im Ordner existieren Unterordner (also die Anzahl meiner Clients) auslesen und so die Menge der benötigten Variablen festlegen (Für jeden Client eine Variable) und zweitens wie lese ich die Unterordner in meine Variablen ein. Am schönsten wäre es wenn es pro Unterordner eine Variable geben würde, damit es auf allen Clients gleichzeitig laufen würde, allerdings würde es auch als Schleife funktionieren, also das es nur eine Variable gibt die dann nach jeden Durchlauf den nächsten Clientnamen zugewiesen bekommt.

Über Antworten würde ich mich sehr freuen!

Content-Key: 149207

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: bastla
bastla 18.08.2010 um 09:29:18 Uhr
Goto Top
Hallo b2kbutt und willkommen im Forum!

Selbst wenn Du eine Paralleleverarbeitung durchführen würdest, wäre das Erzeugen eines "Pseudo"-Arrays (echte gibt es in Batch nicht) nicht nötig ...

Der Ablauf könnte (für sequentielles Abarbeiten) etwa so aussehen:
@echo off & setlocal
set "Basis=D:\Festgelegter Ordner"  

for /d %%i in ("%Basis%\*.*") do call :ProcessDir "%%i"  
goto :eof

:ProcessDir
echo Bearbeite Ordner %1
goto :eof
Wenn tatsächlich mehrere Batches nebeneinander laufen sollen, etwa so:
@echo off & setlocal
set "Basis=D:\Festgelegter Ordner"  

for /d %%i in ("%Basis%\*.*") do start "%%~nxi" cmd /k D:\Verarbeitung.cmd "%%i"  
goto :eof
wobei in "D:\Verarbeitung.cmd" der Ordner (wie oben bei ":ProcessDir") als "%1" ankommt.

Dadurch würde für jeden Unterordner ein neues CMD-Fenster geöffnet, der "Verarbeitungs"-Batch ausgeführt und das Fenster wieder geschlossen (außer, Du würdest "cmd /k" anstelle von "cmd /c" verwenden) - das "Hauptprogramm" endet aber bereits nach Aufruf der Verarbeitung des letzten Unterordners, wartet also nicht auf das Ende des anderen Batches.

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 18.08.2010 um 09:52:28 Uhr
Goto Top
hallo bastla,

erstmal Danke für die schnelle Antwort.

Aber ganz klar ist es mir immernoch nicht.

Auf den FOR Befehl bin ich im Zuge meiner Recherche auch schon gestoßen, aber was ich nicht verstehe ist wie dann die Variable einen neuen Wert bekommt.

In welche Variable wird den jetzt nun der der Ordnername geschrieben?
Und wie funktioniert es, dass nun der Varible, nach dem ersten Durchlauf, der Ordnernamen des zweiten Unterordners zugewiesen wird, und nicht wieder der des ersten?

Grüße
b2kbutt
Mitglied: bastla
bastla 18.08.2010 um 10:35:50 Uhr
Goto Top
Hallo b2kbutt!

Bei jedem Schleifendurchlauf (in diesem Fall für jeden Ordner) wird der Teil nach dem "do" ausgeführt, wobei in der Variablen "%%i" jeweils der volle Pfad des Ordners enthalten ist. Dieser lässt sich bei Bedarf auch in Bestandteile zerlegen (siehe "for /f" ziemlich gegen Ende), zB mit "%%~nxi" für Name und Extension (Typ) des Ordners (gemeint ist mit Letzterem alles nach dem letzten in Namen enthaltenen Punkt, falls es einen solchen geben sollte).

Ansonsten kannst Du ja die erste Variante (direkt von der Kommandozeile oder mit einem "pause" - zwischen Zeile 4 und 5 eingefügt) einmal testen ...

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 19.08.2010 um 15:21:01 Uhr
Goto Top
Ok jetz hab ich das auch verstanden danke nochmal..

Also ich schreib jetz den Ablauf den ich für jeden Client will unter die Sprungmarke :ProcessDir.
Soweit alles klar.
Aber was macht die Schleife nach dem alle Clients abgearbeitet wurden? Durch die Zweite Sprungmarke :goto eof springt sie doch dann immer wieder zum Anfang oder?

Grüße b2kbutt
Mitglied: bastla
bastla 19.08.2010 um 15:42:40 Uhr
Goto Top
Hallo b2kbutt!
Durch die Zweite Sprungmarke :goto eof springt sie doch dann immer wieder zum Anfang oder?
Da "end of file" nix mit "Anfang" zu tun hat face-wink, brauchst Du Dir deswegen keine Sorgen zu machen - abgesehen davon: Was hat denn Dein Test diesbezüglich ergeben?

Wenn Du beim Testen auch noch anstelle von "echo off" ein "echo on" verwendest und den Batch von der Kommandozeile startest, kannst Du ganz genau sehen, was da so abläuft ...

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 19.08.2010 um 16:04:00 Uhr
Goto Top
Hey Bastla,

Sorry mein Fehler, ich dachte eof wäre vllt sowas ähnliches wie eine Umgebungsvariable und würde für @echo OF stehen ^^( peinlich peinlich)
Zum Testen bin ich bisher noch nich gekommen, da ich immernoch dabei bin, auszuteststen wie die ganzen Unterbefehle reagieren, die dann von der Schleife aufgerufen werden. Wenn ich fertig bin, evtl sogar schon morgen, werde ich den ganzen Code mal posten, ums auch für weitere Sucher festzuhalten, und dann mal Bericht erstatten wies gelaufen ist.

Nochmal danke für die schnelle Hilfe!

Grüße
b2kButt
Mitglied: bastla
bastla 19.08.2010 um 16:13:36 Uhr
Goto Top
Hallo b2kbutt!

Das "Steuerprogramm" kannst Du ja (wie in meinem ersten Batch gezeigt) für sich testen - das Unterprogramm wird einfach durch eine Bildschirmausgabe simuliert ...
"eof" stellt eine (imaginäre) Sprungmarke am Ende des jeweiligen Batches dar (insofern wäre das zweite "goto :eof" hier überhaupt nicht erforderlich, da es ohnehin schon in der allerletzten Batchzeile steht); im Hinblick auf das Unterprogramm wäre dieses "goto :eof" mit einem "Return" in (altem) BASIC, also dem Rücksprung zum aufrufenden Hauptprogramm, vergleichbar, während das erste "goto :eof" das Hauptprogramm beendet (damit eben nicht noch ein weiteres Mal das Unterprogramm durchlaufen wird) ...

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 20.08.2010 um 11:41:32 Uhr
Goto Top
Hallo Bastla,

So ganz funktionierts noch nicht.

Ich hab jetzt folgenden Code (nurn auszug)

REM  SCHLEIFE FÜR EINZELNE CLIENTS (selected by Rechnernamen)

set "Basis=C:\Rechnernamen"   

:Begin
for /d %%c in ("%Basis%\*.*") do call :ProcessDir "%%~nxc"   
goto :eof

:ProcessDir
echo %c%
pause
echo > %c%, %DATE%, %TIME%.txt > "%c%, %DATE%.txt"  
echo "-------------IPCONFIG -ALL-------------" >> "%c%, %DATE%.txt"  
psexec.exe \\%c% -u %u% -p %pwd% -n 15 ipconfig -all >> "%c%, %DATE%.txt"    
echo. >> "%c%, %DATE%.txt"  
echo. >> "%c%, %DATE%.txt"  

Leider ist es jetzt so, das die variable c (für client) nicht in das Unterprogramm mit reingenommen wird, sprich beim Befehl psexec ensteht eine Fehlermeldung,da hinter \\ nichts steht, obohl da der Rechnernamen hinmüsste.

Gibt es dafür auch eine Lösung oder ist es nicht möglich eine Variable aus dem Hauptprogramm mit in die Schleife zu nehmen?

Grüße

b2kbutt
Mitglied: bastla
bastla 20.08.2010 um 12:20:28 Uhr
Goto Top
Hallo b2kbutt!

Fällt Dir etwas an meiner Zeile
echo Bearbeite Ordner %1
auf? Wenn Du lt meinem Vorschlag getestet hättest, sollte es eigentlich ...

Ansonsten: Variablen aus dem Hauptprogramm (mit Ausnahme der Schleifenvariablen, wie bei Dir "%%c") stehen sehr wohl auch im Unterprogramm zur Verfügung - wenn Du allerdings dann auch noch aus "%%c" (das tatsächlich nicht funktionieren konnte) ein "%c%" machst ...

Grüße
bastla

P.S.: Da Du vermutlich schon nach der "Code"-Formatierung gesucht hast: Die Beschreibung dafür findest Du .
Mitglied: b2kbutt
b2kbutt 20.08.2010 um 13:49:26 Uhr
Goto Top
Hallo Bastla

Natürlich ist mir die Zeile aufgefallen, ich hielt die 1 nur für ein großes i, was mich zwar gewundert hat, da Variablen ja eigentlich case sensitive sind, ich aber ignoriert habe.

Nur war und ist mir nicht klar, warum der Ordnernamen in der Variablen 1 steht, wenns doch vorher die Variable i bzw bei mir c war.

Also die Schleife läuft soweit, die Variable nimmt auch den Ordnernamen, bzw den Rechnernamen an, Problem ist nur das der Rechnername in in Anführungszeichen zurückgegeben wird und die Anwendung in die der Parameter eingelesen werden soll, abstürzt wenn selbiger Parameter in Anführungszeichen steht.

Nochmals Danke für die Hilfe

Grüße

b2kbutt
Mitglied: bastla
bastla 20.08.2010 um 14:11:50 Uhr
Goto Top
Hallo b2kbutt!

Das Unterprogramm wird wie ein weiterer (eben nur in der selben Datei gespeicherter) Batch behandelt - und die Aufrufparameter eines Batches sind nun mal %1, %2, etc ...

Um die Anführungszeichen zu vermeiden, verwende anstatt %1 die Schreibweise %~1.

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 24.08.2010 um 08:07:53 Uhr
Goto Top
Morgen Bastla!

Also es funktioniert jetzt alles wunderbar.
Nochmal Danke für die Hilfe

grüße

b2kbutt

Anbei nochmal mein Code

@echo off & setlocal
color 0A
REM Username, Passwort

set /p u=Bitte Benutzernamen eingeben: 
set "GetPW=%temp%\GetPW.vbs"  
echo WScript.Echo CreateObject("ScriptPW.Password").GetPassword()>"%GetPW%"  
echo Bitte Passwort eingeben: 
for /f "delims=" %%i in ('cscript //nologo "%GetPW%"') do set "pwd=%%i"  
del "%GetPW%"  


REM  SCHLEIFE FÜR EINZELNE CLIENTS (selected by Rechnernamen)

set "Basis=C:\Rechnernamen"   

:Begin
for /d %%c in ("%Basis%\*.*") do call :ProcessDir "%%~nxc"   
goto :eof
:ProcessDir
echo %1
echo > %DATE%, %TIME%.txt > "%1, %DATE%.txt"  

echo "-------------IPCONFIG -ALL-------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 ipconfig -all >> "%~1, %DATE%.txt"    
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%Date%; %TIME%" >> "%1, %DATE%.txt"  


echo "--------------NSLOOKUP--------------" >> "%1, %DATE%.txt"   
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 nslookup %computername% >> "%1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"    
echo. >> "%~1, %DATE%.txt"   
echo "%DATE%; %TIME%" >> "%~1, %DATE%.txt"  


echo "-------------TRACERT----------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 tracert  %computername% >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%.txt"  

echo "-------------PATHPING---------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 pathping %computername% >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"   
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%.txt"   


echo "-------------NETSTAT -A-------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 netstat -a >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%.txt"   


echo "-------------NETSTAT -B-------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 netstat -b >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%, %TIME%.txt"  


echo "-------------NBTSTAT -A-------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 nbtstat -a %computername% >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%.txt"  


echo "-------------NBTSTAT -N-------------" >> "%~1, %DATE%.txt"  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 nbtstat -n >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
echo "%DATE%; %TIME%" >> "%~1, %DATE%, %TIME%.txt"  


echo "-------------arp -a-------------" >> "%~1, %DATE%.txt"   
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 arp -a >> "%~1, %DATE%.txt"  
echo. >> "%c%, %DATE%.txt"  
echo. >> "%c%, %DATE%.txt"   


echo -------------NETIO-------------- >> "%~1, %DATE%.txt"  
start "" /Min netio.exe -s -t  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 -c -f netio.exe -t %computername% >> "%~1, %DATE%.txt"  
@echo off
taskkill /F /IM netio.exe

echo. >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%.txt"  
pause

echo Eventlog Dump (Errors und Warnings) >> "%~1, %DATE%.txt"  
echo. >> "%~1, %DATE%, %TIME%.txt"  
psloglist \\%~1 -u %u% -p %pwd%  -s -t \t -f we >> "%~1, %DATE%.txt"  
echo.
echo End of log
pause
goto :eof
Mitglied: bastla
bastla 24.08.2010 um 09:14:33 Uhr
Goto Top
Hallo b2kbutt!
Also es funktioniert jetzt alles wunderbar.
Das ist schön ... face-smile

... ich hätte allerdings noch einen (ungetesteten) Vorschlag: Wenn Du den Namen der Logdatei einer Variablen (zB %Log%) zuweist, wird das Ganze nicht nur handlicher / übersichtlicher / änderungsfreundlicher, sondern Du reduzierst auch die Fehlerwahrscheinlichkeit - daher zB:
:ProcessDir
echo %1
set "Log=%~1, %DATE%.txt"  

 >"%Log%" echo %DATE%; %TIME%  

>>"%Log%" echo -------------IPCONFIG -ALL-------------  
psexec.exe \\%~1 -u %u% -p %pwd% -n 15 ipconfig -all >>"%Log%"    
>>"%Log%" echo.  
>>"%Log%" echo.  
>>"%Log%" echo %Date%; %TIME%  


>>"%Log%" echo --------------NSLOOKUP--------------  
...
wobei ich Deine Zeile 22 etwas uminterpretiert habe, da sie mir in der Form
echo > %DATE%, %TIME%.txt > "%1, %DATE%.txt"
nicht wirklich verständlich war.

Da der Teil
>>"%Log%" echo.  
>>"%Log%" echo.  
>>"%Log%" echo %Date%; %TIME%  
ja sehr oft benötigt wird, böte es sich an, dafür ein weiteres Unterprogramm einzusetzen - dazu nach der Zeile 101 anfügen:
:Footer
>>"%Log%" echo.  
>>"%Log%" echo.  
>>"%Log%" echo %Date%; %TIME%  
goto :eof
und dann jeweils nur ein
call :Footer
als Ersatz der Zeilen 26 - 28, 33 -35, etc ...

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 25.08.2010 um 13:13:00 Uhr
Goto Top
Hey Bastla!

Dazu kann ich nur sagen: "Wo du recht hast hast du recht" face-smile

Es is ja bisher nur die erste Version der Diagnose. Mittlerweile ist ein SQL Test auch noch dazugekommen. Bis ich das alles so Wartungsfreundlich wie möglich hinbekommen hab isses nochn weiter Weg.

Btw, weist du zufällig wie ichs hinbekomme, zwei Befehle in die gleiche Zweile von ner TXT-Datei zu Pipen?

Also das das Resultat nicht so aussieht:

25.08.2010, 12:49:37,69
4096:1:15:15.00:66.67

sondern so:

25.08.2010, 12:49:37,69 4096:1:15:15.00:66.67

Die Befehle wären die beiden:
echo %Date%, %TIME% >> sql.txt
sqlcmd -U cwduser -P "" -S testsql2005\sql2005 -Q "select wert from SystemValues where Eigenschaft like 'DBVersion'" -p1 >> sql.txt  

Grüße
b2kButt
Mitglied: bastla
bastla 25.08.2010 um 13:23:05 Uhr
Goto Top
Hallo b2kbutt!

Ersetze die erste Zeile durch
>>sql.txt <nul set /p=%date%, %time% 
Grüße
bastla
Mitglied: b2kbutt
b2kbutt 25.08.2010 um 14:29:38 Uhr
Goto Top
Hallo Bastla!

Funktioniert in der Theorie ganz gut, allerdings in der Praxis nicht, da die Ausgabe von sqlcmd mehrzeilig ist.
Sprich es kommt dann folgendes dabei raus:

25.08.2010, 14:07:28,17wert
66

(1 Zeilen betroffen)

4096:1:1:1.00:1000.00

Das Problem ist nun, das ich die den ganzen Block in der Form brauche:

25.08.2010, 14:07:28,17 4096:1:1:1.00:1000.00
Durch filtern mit findstr hab ich es nun schon geschafft, das es so untereinander steht:

25.08.2010, 12:49:37,69
4096:1:15:15.00:66.67

Allerdings steht oberhalb und unter halb sehr oft das Datum, da ich mit findstr nach der Zeichenfolge "4096 25" suche, sprich alle Zeilen, die den 25.08.10 enthalten und die Zeilen folge 4096.

Da die Rohdatei, die gefiltert wird ein log ist, und somit ziemlich groß wird, Steht der 25.08.10 eben auch sehr oft drin.

Ich brauch aber eben nur die Zeilen in denen nicht 4096:1:1:1 steht und die Zeile davor, in der das DAtum und die Uhrzeit angegeben ist.

Hast du auch noch ne Idee wie das von Statten gehen könnte?

gruß
b2kbutt
Mitglied: bastla
bastla 25.08.2010 um 14:39:02 Uhr
Goto Top
Hallo b2kbutt!

Ganz klar ist mir das jetzt nicht ...

Poste bitte (als Code formatiert) ein Beispiel der Ausgabe von "sqlcmd" und das daraus abgeleitete gewünschte Ergebnis!

[Edit] Wenn Du nur die jeweiligen Zeilen mit "4096" brauchst, sollte ja eine Schleife der Art
for /f "delims=" %%i in ('sqlcmd -U cwduser -P "" -S testsql2005\sql2005 -Q "select wert from SystemValues where Eigenschaft like 'DBVersion'" -p1^|findstr "4096"') do >>sql.txt echo %date%; %time% %%i
funktionieren (wobei allerdings für jede Zeile die gleiche Uhrzeit ausgegeben wird - lässt sich bei Bedarf aber ändern) ...
[/Edit]

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 25.08.2010 um 16:22:27 Uhr
Goto Top
Hallo Bastla!

Zuerstmal der Code der Bat in der das sqlcmd ausgeführt wird:

:start
echo %Date%, %TIME% >> sql.txt
echo. >> sql.txt
sqlcmd -U cwduser -P "" -S testsql2005\sql2005 -Q "select wert from SystemValues where Eigenschaft like 'DBVersion'" -p1 >> sql.txt  
echo. >> sql.txt
echo. >> sql.txt
ping -n 6 localhost
goto :start


Ursprünglicher Output:

24.08.2010, 15:30:03,30 
 
wert                                                                                                                                                                                                                                                           
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
67                                                                                                                                                                                                                                                             

(1 Zeilen betroffen)

4096:1:1:1.00:1000.00 
 
 

Mit der von dir geänderten Zeile sieht das ganze so aus:

25.08.2010, 14:07:28,17wert                                                                                                                                                                                                                                                           
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
66                                                                                                                                                                                                                                                             

(1 Zeilen betroffen)

4096:1:1:1.00:1000.00 
 
 

Optimales Ergebniss:

25.08.10, 16:21:33, 4096:1:1:1.00:1000.00 

Grüße b2kbutt
Mitglied: Biber
Biber 25.08.2010 um 16:40:41 Uhr
Goto Top
Moin b2kbutt,

so ganz durchschaue ich es auch noch nicht, wie viele Rückgabezeilen du erwartest - kommen denn an echten Resultsetzeilen eher eine oder eher 5 oder eher 245 zurück?
Außerdem ist doch das "Datum" und die "Uhrzeit", die du dir jetzt vom OS abholst, auf der der Batch läuft. (also%date% und %time%) doch genauso gut oder schlecht wie ein SYSDATE() oder ein "CURRENT TIME" oder was immer du vom Datenbankserver bekommen würdest.

Dann bau doch genau so eine Abfrage mit in dein Statement ein, also statt "Select wert from X" ein "Select sysdate() as Datum, wert from X".

Grüße
Biber
Mitglied: b2kbutt
b2kbutt 27.08.2010 um 17:17:46 Uhr
Goto Top
nAbend Biber

also passt auf es geht um Folgendes:

Sqlcmd isn Kommandozeilenprogramm, mit dem unteranderem SQL abfragen gemacht werden können.

Die Batch, die ich geschrieben hab, ruft also alle 5 Sekunden die Versionsnummer der SQL-Datenbank ab, und schreibt das was rauskommt in ne Textdatei.
Das Was nur das SQLCMD ausgiebt is immer folgendes:

wert                                                                                                                                                                                                                                                           
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
67                                                                                                                                                                                                                                                             

(1 Zeilen betroffen)

4096:1:1:1.00:1000.00

Wobei die 4096 die bytegröße darstellt, und die zweite eins is die Zeit , die die Abfrage gedauert hat in Millisekunden.

Der Hintergrund is folgender

Die batch soll als test in nem netzwerk laufen, in dems immer wieder Probleme mit der Performance der SQL-Geschwindigkeit gibt, bzw allgemein mit dem Netzwerk.

Jetz läuft also diese Batch ne Nacht durch, und erzeugt dabei als Output ne Textdatei, die ca 15 MB groß ist.

Wenn ich nun also diese batch mit FINDSTR /V "4096:1:1:1" durchsuche und den Output in ne zweite TXT pipe, krieg ich alle zweilen, in denen der Ausdruck nicht enthalten ist. Wenn ichs dann nochmal mit FINDSTR /B "4096 25" filter, krieg ich ne Textdatei, in Der das Datum ganz oft untereinander steht (Wegen der 25, weils halt am 25.08. war) und halt zwischendrin ab und zu mal ne 4096:1:32:1 oder so...

Und jetz is halt die Frage, wie ichs schaffe, das der Output dann so aussieht:

25.08.10, 8:37:34,17, 4096:1:32:1

Weil dann muss ichs nur einmal mit FINDSTR "4096" Filtern, um die Zeiten rauszubringen, zu der die SQL Abfragen so lange gedauert haben, weil ja dann Datum und Uhrzeit mit in der gleichen Zeile stehen, und somit nicht mit ausgefiltert werden.

Grüße

b2kbutt
Mitglied: bastla
bastla 27.08.2010 um 17:31:23 Uhr
Goto Top
Hallo b2kbutt!

Wenn ich davon ausgehe, dass Du meine Version von 25.08.2010, 14:39:02 Uhr getestet und das oben beschriebene Ergebnis erzielt hast (was ich hinsichtlich der anscheinend im Ergebnis enthaltenen Zeilenumbrüche durchaus interessant finde), wäre ja zumindest Bibers Vorschlag, also etwa
sqlcmd -U cwduser -P "" -S testsql2005\sql2005 -Q "select sysdate() as Datum, wert from SystemValues where Eigenschaft like 'DBVersion'" -p1|findstr "4096">>sql.txt
noch einen Versuch wert ...

Grüße
bastla
Mitglied: Biber
Biber 27.08.2010 um 18:15:16 Uhr
Goto Top
Moin b2butt,

ergänzend zu bastla möchte ich noch mal anmerken, dass wir hier ausschliesslich an der handwerklichen Umsetzung deines "fast fertigen" Plans mit diskutieren.
Also auf eine Frage "Wie lange darf ich ein Frühstücksei maximal kochen, wenn ich nur Plastiklöffel zum Schale entfernen benutzen kann?" antworten, die an die Chefkoch.de-Redaktion gestellt wurde.

Ich möchte mich ausdrücklich davon distanzieren, dass dein Ziel...
Der Hintergrund is folgender

Die batch soll als test in nem netzwerk laufen, in dems immer wieder Probleme mit der Performance der SQL-Geschwindigkeit gibt,
bzw allgemein mit dem Netzwerk.
...so erreicht und DB-Flaschenhälse mit einem derartigen Gestrunkele analysiert werden sollten.

Mindestens zwei,drei Fragen drängen sich mir schon auf
  • welches Schicksal hat denn den DB-Admin ereilt - oder hattet ihr noch nie einen?
  • falls da noch nie ein DBA in eurem Postleitzahlenbereich vorbeikam - WTF hat dir denn erzählt, dass sich so ein Datengelörre wie "Jetz läuft also diese Batch ne Nacht durch, und erzeugt dabei als Output ne Textdatei, die ca 15 MB groß ist". am komfortabelsten als unstrukturierte Textdatei mit Findstr analysieren liesse?? Oder ist das eine Wette?
  • WTHF muss denn ein Clientrechner (!!) alle 5sec(!!) das Netzwerk und den Server beschäftigen, um eine nicht-verfälschende Last-Messung durchzuziehen?

Ich meine, ich versteh ja nich' viel von Datenbanken, aber mein Tipp wäre:
  • der Beitrag hier mit dem Titel "Ordnernamen in Variable schreiben" wird wahrscheinlich ohnehin nicht so viele DB-Experten anlocken
  • mach doch einen neuen Beitrag im Bereich "Datenbanken" auf mit dem Titel "Wie Performance-Engpässe lokalisieren?" und lass deine Lösungsansätze mal weg.

Grüße
Biber
Mitglied: b2kbutt
b2kbutt 30.08.2010 um 09:28:59 Uhr
Goto Top
Moin,

@bastla:

Die Zeilenumbrüche werden vom Programm SQLCMD selbst erzeugt, darauf hat man keinen Einfluss.

Den Vorschlag von Biber hab ich getestet der Output sieht dann so aus

4096:1:79:79.00:12.66 

Was ansich voll in Ordnung wäre, ich bräuchte halt nur noch Datum und Zeit in der gleichen Zeile, was aber ja anscheinend nicht möglich ist.

@Biber:

Das Problem haben sich bereits sowohl alle DB- und Netzwerkspezialisten aus meiner Firma angesehen, als auch die komplette EDV-Abteilung des betroffenen Netzwerkes (es handelt sich um ein Uniklinikum (!)).
Da die Probleme zu den unterschiedlichsten Zeiten in den unterschiedlichsten Abteilungen (Räumlicher Abstand bis zu 500 Meter) auftreten, braucht man eben relativ dichte Logs, um dann Parallelen zwischen SQL, Netzwerkbelastung, Netzwerkgeschwindigkeit, und Latenzzeiten ziehen zu können, wenn die Probleme eben auftreten.

Es gäb ja ein tool, mit dem sich die SQL-Performance spitze überwachen ließe, aber leider hab ichs bisher noch nicht geschafft, es unter Windows zum laufen zu bringen.

Nochmal danke für eure Bemühungen

Grüße

b2kbutt
Mitglied: bastla
bastla 30.08.2010 um 10:11:09 Uhr
Goto Top
Hallo b2kbutt!

Mein Hinweis auf die Zeilenschaltungen bezog sich darauf, dass ja "findstr" eigentlich zeilenorientiert arbeitet und daher aus der "for"-Schleife nur einzelne Zeilen kommen dürften - so wie das Ergebnis bei Dir aussieht, wird die gesamte Ausgabe von SQLCMD als eine einzige Zeile betrachtet (da ansonsten zum einen nach dem Filtern nur die erste Zeile überbleiben dürfte, oder, wenn der Filter nicht ok wäre, vor jeder Ausgabezeile Datum und Uhrzeit stehen müssten) - die einzige Erklärung, die mir dafür einfällt, wäre, dass keine "Windows-Zeilenschaltungen" (also CR + LF) geliefert werden ...

Grüße
bastla
Mitglied: b2kbutt
b2kbutt 31.08.2010 um 14:57:59 Uhr
Goto Top
Hey Bastla,

Das mit dem Output is eben keine einzelne Zeile, sondern wird in mehrere Zeilen geschrieben.

Hab das Problem jetzt gelöst.

Ich habs so gefiltert das es so aussieht:

%DATE%, %TIME%
[Output SQLCMD]

Jetz lass ich da einfach mit Notepad++ ein Makro drüberlaufen, das einfach immer den Zeilenumbruch vor dem Output weglöscht.
Dauert zwar n paar Minuten aber immerhin besser als nichts face-smile

Nochmal danke für die vielen Antworten.

Grüße
b2k@butt

PS: Denke der Thread kann geschlossen werden