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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149207
Url: https://administrator.de/forum/ordnernamen-in-variable-schreiben-149207.html
Ausgedruckt am: 23.12.2024 um 18:12 Uhr
25 Kommentare
Neuester Kommentar
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:
Wenn tatsächlich mehrere Batches nebeneinander laufen sollen, etwa so:
wobei in "D:\Verarbeitung.cmd" der Ordner (wie oben bei "
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 "
Grüße
bastla
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
@echo off & setlocal
set "Basis=D:\Festgelegter Ordner"
for /d %%i in ("%Basis%\*.*") do start "%%~nxi" cmd /k D:\Verarbeitung.cmd "%%i"
goto :eof
: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
Hallo b2kbutt!
Bei jedem Schleifendurchlauf (in diesem Fall für jeden Ordner) wird der Teil nach dem "
Ansonsten kannst Du ja die erste Variante (direkt von der Kommandozeile oder mit einem "
Grüße
bastla
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
Hallo b2kbutt!
Wenn Du beim Testen auch noch anstelle von "
Grüße
bastla
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 , 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
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 ...
"
Grüße
bastla
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
Hallo b2kbutt!
Fällt Dir etwas an meiner Zeile
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 .
Fällt Dir etwas an meiner Zeile
echo Bearbeite Ordner %1
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 .
Hallo b2kbutt!
... 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:
wobei ich Deine Zeile 22 etwas uminterpretiert habe, da sie mir in der Form
nicht wirklich verständlich war.
Da der Teil
ja sehr oft benötigt wird, böte es sich an, dafür ein weiteres Unterprogramm einzusetzen - dazu nach der Zeile 101 anfügen:
und dann jeweils nur ein
als Ersatz der Zeilen 26 - 28, 33 -35, etc ...
Grüße
bastla
Also es funktioniert jetzt alles wunderbar.
Das ist schön ... ... 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--------------
...
echo > %DATE%, %TIME%.txt > "%1, %DATE%.txt"
Da der Teil
>>"%Log%" echo.
>>"%Log%" echo.
>>"%Log%" echo %Date%; %TIME%
:Footer
>>"%Log%" echo.
>>"%Log%" echo.
>>"%Log%" echo %Date%; %TIME%
goto :eof
call :Footer
Grüße
bastla
Hallo b2kbutt!
Ganz klar ist mir das jetzt nicht ...
Poste bitte (als Code formatiert) ein Beispiel der Ausgabe von "
[Edit] Wenn Du nur die jeweiligen Zeilen mit "4096" brauchst, sollte ja eine Schleife der Art
funktionieren (wobei allerdings für jede Zeile die gleiche Uhrzeit ausgegeben wird - lässt sich bei Bedarf aber ändern) ...
[/Edit]
Grüße
bastla
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
[/Edit]
Grüße
bastla
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
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
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
noch einen Versuch wert ...
Grüße
bastla
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
Grüße
bastla
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...
Mindestens zwei,drei Fragen drängen sich mir schon auf
Ich meine, ich versteh ja nich' viel von Datenbanken, aber mein Tipp wäre:
Grüße
Biber
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.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.
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
Hallo b2kbutt!
Mein Hinweis auf die Zeilenschaltungen bezog sich darauf, dass ja "
Grüße
bastla
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