Jump to content

Biber

Members
  • Gesamte Inhalte

    97
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt 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 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

  4. 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.

  5. Moin jfish,

     

    wie Dr.Kiffer schon schrieb...

    ich glaube dein Problem liegt im Einzeiler.

     

    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

  6. 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

  7. 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

  8. 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?

  9. 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

  10. Moin El Kassem,

    Endlosschleife..

    Funkt nicht..

    springt nicht mehr dorten hin.. (hat vorher funktioniert..)

    [/Quote]

     

    Glaub ich (fast) alles.

    Nur dass es jemals funktioniert hat: das nicht ;-)

     

    ...
    set /p auswahl=

    IF %auswahl%=="1" GOTO office2003
    IF %auswahl%=="2" GOTO office2007
    IF %auswahl%=="3" GOTO raus
    :: Mehr als "1" ; "2"; "3" wird nicht geprüft.

    [/Code]

     

    --> Beide Seiten des "=="-Zeichens in die gleichen Begrenzer (z.b. Anfü-Zeichen)packen:

    --> IF "%auswahl%"=="1" GOTO office2003

     

    und... : unter die letzte Prüfung ein "GOTO :Fehler" oder "GOTO :nochmal".

    Falls der Benutzer ein "X" eingibt oder sein Geburtsdatum.

     

    Bätches lassen sich übrigens testen, wenn das "Echo off" zeitweilig auskommentiert wird und an neuralgischen Punkten ein(e) "pause" eingebaut wird.

     

    Grüße

    Biber

  11. 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

  12. 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

  13. 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

  14. An den Variablen liegt es nicht sondern irgendwie an der Find funktion denn wenn ich auch nur die Datei auf den Desktop lege und
    find /i "string" dateiname 

    eingebe gibt er mir keine ergebnis zurück obwohl der String "checked" in der Datei eindeutig vorhanden ist.

     

    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

  15. 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

  16. @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

  17. 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

  18. 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

  19. 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

  20. 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...