Jump to content

Biber

Members
  • Gesamte Inhalte

    97
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von Biber

  1. Moin HerrPi, die gute Nachricht zuerst: du hast eigentlich keinen Denkfehler in deinem Schnipsel. Schlechte Nachricht: die Variablenableitung mit [%]%~t kann keine Sekunden liefern. Kurze Simulation am CMD-Prompt >for %i in (user*.txt) do @echo %i %~ti Userids.txt 13.04.07 16:54 userlist.txt 14.05.08 07:07 [/Code] ---> die Datum/Zeit-Auflösung geht maximal runter auf Minutengenauigkeit. Workaround a) [i][Recommended][/i] Änderung des Plans - Prüfen, ob eine Umbenennung auf Namen mit Sekundengenauigkeit ganz ganz wirklich ganz ganz unbedingt erforderlich ist. b) Wenn es unausweichlich erscheint, dann mittels eines JScript/VBScript-Schnipselchens nach der (Datei-)Uhrzeit fragen und übernehmen. Möglichkeit b) geht also auch durchaus - ist aber IMHO im Regelfall überkandidelte Effekthascherei. Grüße Biber
  2. Moin Blade, sorry, ich hatte vorhin zu flüchtig auf das Originalbeispiel geschaut und in meinem Beispiel nicht den Suchstring "-A", sondern den String "A-1" verwendet. Irgendeine Freud'sche Fehlleistung, nehme ich an. Anyhow, hier nochmal das Ganze in epischer Breite und schrittweise am CMD-Prompt hergeleitet. Die Zeilen, die mit ">" beginnen, sind die Eingaben. Das ">" NICHT mit eingeben. >set testusername=Benutzer-a01 >echo Benutzer: [%testusername%] Benutzer: [benutzer-a01] >echo %testusername%|find /i "-a" Benutzer-a01 >echo %errorlevel% 0 >echo %testusername%|find /i "-x" >echo %errorlevel% 1 [/Code] Ich definiere oben mit dem SET-Befehl eine Umgebungsvariable %testusername%. Als Erstes lasse ich die anzeigen mit Echo. Okay, keine Kunst. Danach übergeb ich die echo-Ausgabe mit dem Pipe-Symbol "|" an den Find-Befehl. Die Sequenz "befehl1 | befehl2" heißt nichts anderes als "Übergib die Ausgabe von befehl1 als Input für befehl2". In meinem Fall wird oben also der Text "Benutzer-a01" quasi als Input-File an den Find-Befehl übergeben mit der Aufforderung "Schau ma', ob in diesem Text ein "-a" vorkommt. Ach ja, gross/kleingeschreibung /i = ignorieren. Okay, wenn der Suchstring gefunden wird, dann setzt der Find-Befehl das Errorlevel 0 - bedeutet "Alles prima, Erfolg gehabt, gefunden, TRUE" Wird der Suchstring nicht gefunden wird, dann setzt der Find-Befehl das Errorlevel 1 - bedeutet "Fehler, Pech gehabt, nicht gefunden, FALSE". Die Befehlsverkettung " (befehl1) && (befehl2)" bedeutet: führe erst befehl1 aus, wenn der klappt/TRUE liefert/errorlevel 0 setzt, NUR DANN führe befehl2 aus Die Befehlsverkettung " (befehl1) || (befehl2)" bedeutet: führe erst befehl1 aus, wenn der Fehler wirft/FALSE liefert/errorlevel > 0 setzt, NUR DANN führe befehl2 aus Grüße Biber
  3. Moin Blade, eine etwas kürzere Variante wäre (Beispiel zum Test am CMD-Prompt): echo %username%|find /i "a-1">nul && @echo Ist ein A-1-User -bzw- echo %username%|find /i "a-1">nul || @echo Issn DAU [/Code] In Deinem batch entsprechend [Code] .... echo %username%|find /i "a-1">nul && goto :weiterBeiA1Usern ... [/Code] Grüße Biber
  4. ...oder aber, wenn die aufzurufende Batchdatei nun defrag.bat/defrag.cmd heißen soll, dann muss eben die "Defrag.exe" aus diesem Batch heraus mit vollständiger Pfadangabe aufgerufen werden. Beispel in der Batch: [/Code] ... :: statt des flapsigen "defrag C: /v" %windir%\system32\defrag.exe C: /v ... [/Code] Grüße Biber
  5. Hm, ich wette den rechten Arm meines Cheffes, dass die Batchdatei "defrag.cmd" oder "defrag.bat" heißt... ;-) ich würde die mal vor weiteren Tests umbenamsen. Grüße Biber
  6. Moin Errorsmith, ich möchte hier nur den handwerklichen Teil kurz abhandeln. Den konzeptionellen solltest Du noch mal gesondert für Dich klären. Umbenennen von Dateien auf yyyymmdd-hhmm-dateiname.ext: for %f in (*.*) do @for /f "tokens=1-5 delims=:. " %i in ("%~tf") do @echo Ren "%f" "20%k%j%i-%l%m_%~nxf" [/Code] (Proof-of-Concept-Skizze am Cmd-Prompt; im Batch alle %-Zeichen durch %% ersetzen.) Jetzt das ABER. Du willst ja (vermutlich) nur die Dateien umbenennen, die Datum/Uhrzeit noch nicht im Namen haben. Wenn Du aber so einenEinzeiler alle 10 Minuten über Taskplaner oder whatever laufen lässt, werden ja auch die Dateien der letzten, vorletzten etc Umbenamsungsrunde noch mal umbenannt. Ich würde also nahelegen - entweder die Dateien gleich bei der Umbenennung auch inein anderes Verzeichnis zu MOVEn - oder aber den Wildcard-Filter statt auf *.* nur auf die Noch-Nicht-Umbenannten zu legen (z.B ...(sys.* aaa.* bbb.*) , falls Du die weißt - oder aber for dem Umbenennen zu prüfen, ob der Dateiname mit schon mit "2008" beginnt oder ähnliches. Grüße Biber
  7. Moin michel0203, bei dieser speziellen Problematik empfehle ein pragmatisches Vorgehen. Soll heißen: "Lange dauern" wird es so oder so - und die Hauptlast der Verarbeitung liegt ja nicht in der abzubildenden Rekursivität (respektive der möglichen Eleganz der Implementierung mit dieser oder jener Skriptsprache), sondern auf dem ganz banalen Verzeichnis-Auslesen. Dabei kommt ziemlich schnell raus: keine VBS/WSH-Nachprogrammierung ist auch nur ansatzweise zu effektiv wie der stinknormale DIR-Befehl. Deshalb kannst Du das bisschen Rest-Geeiere auch mit ein paar simplen CMD-Batch-Zeilen zusammenschroten. Eine kleine Demo (auch zum sofortigen Einsatz) dazu findest Du hier: Batch for Runaways - Part 1 - Beispiel: FindLongPath.Bat Bedenklich lange Pfade finden - administrator Grüße Biber P.S. Dem Wink/Link von NilsK solltest Du natürlich trotzdem folgen... lohnt sich auf jeden Fall.
  8. Moin jfish, wie Dr.Kiffer schon schrieb... Und zwar wegen der Pipe-Verkettung " find ...|IF %ERRORLEVEL% == 0..." . Gemeint ist ja, dass nur wenn etwas gefunden wurde eine Aktion stattfindet. Richtiger wäre also dann die "logische UND-Verknüpfung" mit "&&" net localgroup administrators|find /I "grp" >nul && @echo %computername% >> txt [/Code] Grüße Biber
  9. Moin fmessner, wenn Du eine tägliche (= 7 Tage pro Woche) Sicherung jedesmal in "das andere" Verzeichnis speichern willst, dann würde ich eher ein Robocoby-Logfile schreiben und dort nachschauen... da steht doch immer das Zielverzeichnis "ZielA" bzw "ZielB" drin. ->find "ZielA" robbies.log erfolreich-> dann mach es heute nach ZielB. --> et vice versa. ODER aber: Dir reichen 6 Sicherungs-Tage pro Woche-> dann Mo, Mi, Fr nach ZielA, Di, Do und Sa nach ZielB. Dann kann das auch ein/e Taskplaner/in. Grüße Biber
  10. Moin fmessner, hast Du denn eher eine spanische Win95-Installation oder eine isländische Vista Business-Variante? Ich frage nur, falls wir irgendwie den Tag-des-Monats brauchen sollten und das %date% auslesen... Na ja, ist auch wurscht.... wenn Du eh Robocopy griffbereit hast, machen wir es so: [Demo am CMD-Prompt] for /f "tokens=5" %i in ('robocopy ^|find "Started"') do @set /a "10%i % 2"|find "0" >nul && echo Goto :gerade [/Code] Erläuterung: Robocopy gibt beim Aufruf ohne Parameter (genau) eine Zeile mit dem Word "Started" aus. In dieser steht als 5. token der Tag-des-Monats (heute z.B.28). Der ganzzahlige Rest dieses Tages geteilt durch 2 (modulo-Funktion) sagt Dir und uns, ob der Tag gerade oder ungerade ist. Ganzzahliger Rest kann nur 0 oder 1 sein. Ja, auch in Schaltjahren. Ist der Rest also = 0 so wie heute, gehst du zu einer Sprungmarke ":gerade", hinter der sich eine Zeile "Robocopy [quelle] [zielA] [tausendParameter]" verbirgt. Und direkt unterhalb der FOR-Anweisung schreibst Du für den Alternativ-fall eine Zwei-Wort-Zeile mit "goto :ungerade", hinter der sich eine Zeile "Robocopy .....[zielB] anfindet. Thats all. P.S Dir ist klar, dass Du bei den meisten Monatswechseln am 31. und am 1. (beides ungerade Tage) nacheinander in das Verzeichnis X sicherst, also dann KEINE Ersatzsicherung hast? Grüße Biber
  11. Moin, in Batchdateien maskierst du ein Prozentzeichen (z.B. bei Variablennamen) durch Verdopplung. CMD: @Echo Mein ^%username^% ist [%username%] Batch. @echo Mein %%username%% ist [%username%] ---- CMD: setx.exe INI_HOME ^%KASTOS1_HOME^%\dat\procini -m Batch: setx.exe INI_HOME %%KASTOS1_HOME%%\dat\procini -m Grüße Biber P.S. Lernt ihr denn gar nichts in Medrond?
  12. Moin El Kassem, in den temporären Outlook-Anhang-Trümmern sind doch die ganzen direkt "in der Mail" doppelgeklickten *.pdfs, *.xls, *.doc, *.ppts etc die so in Unternehmen per Mail rumwandern. Und speziell bei Word haben es die Redmonder ja noch nie hinbekommen, dass jede "$~(restDes Word-Doc-Namens)"-Datei, die beim Öffnen angelegt wird auch wieder nach Beendigung zu löschen. Und diese "$~.."-Dateien sind "versteckt" (Hidden-Attribut) und manchmal auch noch zusätzlich "S" (System-) Dateien. Warum auch immer. Teste es und mach mal ein "Attrib /s "%olkroot%\$~*.*" , dann siehst du die Übeltäter. Wenn Du diese "zuugriff verweigert"-Meldung nicht mehr sehen willst: - entweder vor dem DEL-Befehl den Attrib-Befehl drüberjagen und alle System und Hidden-Atrribute entfernen - oder den DEL-Befehl anweisen ("auch" oder "nur") System/ReadOnly/hidden-Dateien zu löschen. Siehe DEL /? - Oder (auch so etwas machen Kollegen) einfach die Fehlermeldung ins Nirwana leiten. (mit ">nul" oder "2>nul"). Was solls. dann werden eben nicht 500 Trümmer-Dateien je User gelöscht, sondern nur 497... Grüße Biber
  13. Moin El Kassem, die Batch-Variante zu blubs Lösung wäre @echo off & setlocal Set "olkroot=C:\Dokumente und Einstellungen\user\Lokale Einstellungen\Temporary Internet Files" For /d %%i in ("%olkroot%\OLK*") do @ECHO del "%%i\*.*" /s /q [/Code] Das ECHO nur zum Proof-of-Concept; wenn es passt: weglassen. Grüße Biber
  14. Moin edocom, wenn Du aber gerade nur den CMD-Prompt und die "Net User"-Abfragemöglichkeit hast, dann: >@(echo UserName: %username%) &net user %username% /domain|findstr /C:"Kennwort läuft ab" Username: Biber Kennwort läuft ab 9/16/2008 2:10 PM ... so wäre der Schnellschuss vom Prompt aus. [Eingabezeile beginnt mit ">"; der Rest ist Output] Es in den Schnipsel oben einzubauen traue ich Dir zu... ;-) Grüße Biber
  15. Moin wecky, dann lüfte doch auch die letzten Geheimnisse: was steht bitte in %CLASS_PATH% und was in %CURRENT_DIR% drin zu Beginn des Batches? Bau bitte mal oben ein echo für die beiden Vaiablen ein und ein "pause" Grüße Biber
  16. Moin wecky, dann hast Du wahrscheinlich a) unter XP un W2k3 DelayedExpansion per Registry aktiviert und unter W2000 nicht --> also im Batch für alle Fälle ein "setlocal EnableDelayedExpansion" am Anfang zufügen. b) ist vielleicht das CURRENT_DIR unter W2k ein Verzeichnis mit Leerzeichen. Dann schreib den Schnipsel halt etwas robuster: @echo off & setlocal EnableDelayedExpansion set "CLASS_PATH=%CURRENT_DIR%" FOR %%c in ("%CURRENT_DIR%\lib\*.jar") DO set "CLASS_PATH=!CLASS_PATH!;%%c" java -cp "!CLASS_PATH!" de.prog.dosomething %* [/Code] Grüße Biber
  17. Moin J L, nu mal nicht gleich resignieren ... son büschen fertig übersetzten Werkzeugskrams hat XP auch dabei. Musst ja nicht gleich selber scripten. Also ich hab mir Deine so genannte "*.txt"-Datei mal runtergeladen... na ja, unter "Textdatei" habe ich mir etwas anderes vorgestellt. Mit weniger XML-Tags und hätte auch nicht erwartet, den Quellcode einer Browserseite vorzufinden. Anyhow, als TEXT-Datei interpretiert ist dat Dingen ich glaube ~5064 Zeichen lang.. In einer einzigen Zeile -kein Zeilenumbruch (soll ja browserlesbar und nicht menschenlesbar sein ...und Browser orientieren sich an tags, nicht an CRLFs. ) Die XP-Find.exe verweigert allerdings in der Tat bei so langen Zeilen den Dienst - hab nicht getestet, wo genau nun die maximale Zeilenlänge für (XP-) Find.exe ist. Wahrscheinlich bei Größenordnung 2068 (undokumentierte max Zeilenlänge für den CMD-Prompt) Der is schlicht die Zeile zu lang... das is das ganze Geheimnis. Workaround, nein, Quatsch, Lösung: Nimm die FindStr.exe (is sich dabei bei XP) findstr /i /C:"checkbox name=IPFSRStatus0" test.txt >nul && @echo Gefunden! -oder- findstr /i /C:"checkbox name=IPFSRStatus0" test.txt >nul || @echo Nix zu tun... [/Code] Zusätzlich zum Dir ja bekannten Parameter /i habe ich noch /C: für den exakten Vergleich (also alle Zeichen in genau dieser Reihenfolge) angegeben. Siehe FindStr /?. Vista kennt sich auch FindStr. Ebenso Win2000. Würde ich also grundsätzlich verwenden. Grüße Biber
  18. Du kannst ja auch nicht "checked" finden, wenn Du nach "string" suchst.... Kleiner Scherz. kann es daran liegen, dass Du mit "find" vielleicht nicht die %windir%\system32\Find.exe aufrufst, sondern irgendeine längst vergessene Find.bat in Deinem Suchpfad %path%? P.S. Das Testen von Batchdateien durch Doppelklick auf dem Desktop ist ja echt eine geniale Variante :ThumpsUp:. Bist Du da ganz allein drauf gekommen und welche Vorteile hat es beim Testen? Grüße Biber
  19. Moin J L, > In Windows Vista/Server 2008 geht das einwandfrei nur in WinXP findet er sie nicht. hast Du sicherheitshalber mal geprüft, ob an dem XP-Rechner auch beide Umgebungsvariablen %temp% und %tmp% /die zweite benutzt Du) gesetzt sind. %temp% ist immer gesetzt, %tmp% (auf das gleiche Verzeichnis) eigentlich auch - aus Kompatibilitätsgründen. Nur benutzen tut es selten jemand absichtlich... Bringt ein "type %tmp%\test.txt denn das erwartete Ergebnis? Grüße Biber
  20. @vmorbit Im Prinzip ja, aber für "richtigen key" musst Du schon wenigstens an einem Rechner die Fonts installiert haben, sonst kennst Du den Text-Wert der Schriftart nicht. Über den Weg der Scripting Guys brauchst Du nichts dergleichen wissen, falls Du mal einen kompletten Orner mit *.ttf- und *.fon-dateien verteilst. @sammy2000 In dem Artikel steht doch explizit, dass es (leider) remote nicht so funktioniert und das die stressarme und halbwegs ästhetische Alternative über ein LoginSkript geht. Oder die Sieht-aus-wie-gewollt-und-nicht-gekonnt-Variante über "copy *.*" und den DAU-Clients bitten, den FONTS-Ordner mit dem Explorer zu öffnen. Grüße Biber
  21. Moin Canni, vielleicht verstehe ich das Problem ja nicht in seinem ganzen Tiefgang, aber... in dem rlmueller-Schnipsel ist doch schon der Zeitpunkt der letzten Passwortänderung als Datumswert hinterlegt, oder hab ichs mit den Augen? ... dtmPwdLastSet = Integer8Date(objDate, lngBias) 'dtmPwdLastSet ist dein date-Datentyp ' Also wie bisher: objFile.WriteLine strDN & " ; " & blnPwdExpire & " ; " & dtmPwdLastSet ' plus neue Zeile objFile.WriteLine DateDiff("d", Now, dtmPwdLastSet) [/Code] Grüße Biber
  22. Moin lefg, ich versuche es mal.. der Serverkommentar, der bei mir eingetragen ist und den ich "abgreifen" will lautet: ... Serverbeschreibung Biber sein Neuer. Inbetriebnahme Sommer 2006 oder war das schon im Frühling? [/Code] Das ist die komplette Zeile, die mit Findstr rausgeflöht wird (wenn sie denn da ist) diese Zeile fasse ich auf als bestehend aus "Token1" und "dem-ganzen-gottverdammten-Rest", oder auf CMDisch: [Code] for /f "tokens=1,*" %i in ('net config server^|findstr "Serverbesch" ')... [/Code] Und ich sage. Wenn das FindStr scheitert/keine "Serverbeschr" findet, dann soll es mir selbst eine Ausgabe erzeugen mit zwei Token [Code] (entweder FindStr)...^|^| @echo x n/a') do .... [/Code] Somit kommt rechts vom "DO..." immer ein 2-Token-langer oder 1Token+Rest-langer Satz an. Diesen verwurste ich mit einem [durch "@echo" angedeuteten] "Set "srvcomment=%%j"" [Code] @echo set "srvcomment=%j" [/Code] .... was im Fehlerfall hierzu führt: "set "srvcomment=n/a"" Also eigentlich dasselbe wie Du auch vorgeturnt hast, nur ein bisschen eingedampft. Grüße Biber
  23. Moin lefg, kleiner Verbesserungsvorschlag für den Fall, dass die "Serverbeschreibung" aus einem Satz mit mehreren Worten besteht und nicht nur aus einem Stichwort: [Nur die CMD-Prompt-Variante, Eingabezeile hat im Prompt ein ">" vorweg] (=14:11:55 D:\temp=) >for /f "tokens=1,*" %i in ('net config server^|findstr "Serverbesrch"^|^| @echo x n/a') do @echo set "srvcomment=%j" set "srvcomment=n/a" (=14:12:23 D:\temp=) >for /f "tokens=1,*" %i in ('net config server^|findstr "Serverbesch"^|^| @echo x n/a') do @echo set "srvcomment=%j" set "srvcomment=Biber sein Neuer. Inbetriebnahme Sommer 2006 oder war das schon im Frühling?" [/Code] Grüße Biber
  24. Moin Herra, ist ja schon einen Moment her, Deine Frage, aber falls Du noch keine ander Lösung hast: Du kannst über Regedit.exe ausweichen, wenn Du kein Reg.exe vorfindest. Demo am CMD-Prompt (eingegebene Zeilen beginnen mit ">"): >reg Query "HKLM\Software\SQLTools 1.4" /ve ! REG.EXE VERSION 3.0 HKEY_LOCAL_MACHINE\Software\SQLTools 1.4 <NO NAME> REG_SZ D:\Programme\SQLTools 1.4 >regedit -e .\hier.tmp "HKEY_LOCAL_MACHINE\Software\SQLTools 1.4" >type hier.tmp Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\SQLTools 1.4] @="D:\\Programme\\SQLTools 1.4" >For /f "tokens=2 delims==" %i in ('type hier.tmp^|find "@="') do @echo Set "theInstPath=%i" Set "theInstPath="D:\\Programme\\SQLTools 1.4"" [/Code] Also im Prinzip das gleiche Spiel mit einer FOR/F-Anweisung... nur auf eine "echte" Datei bezogen statt auf eine Bildschirmausgabe. Grüße Biber
×
×
  • Neu erstellen...