Christian: Und nochmal: Autom. jüngste Datei hochladen

'n Abend allerseits!

Ich habe mein Problem, welches ich vor über 2 Monaten schon einmal hier formuliert habe, immer noch nicht gelöst:
http://forum.de.selfhtml.org/archiv/2005/6/t108873/#m679045

Zugegeben: Ich habe auch nicht Tag und Nacht dran gearbeitet, aber doch schon Stunden nach Lösungswegen gesucht.

Bio hat mir ja freundlicherweise ein paar Vorschläge gemacht:

"Es gibt da wahrscheinlich einen Befehl "cut" - im Notfall tut's ggf. ein ed-Skript (waaaah! Stoneage-Technology!), wo Du die Zeile durchpipst."

Den Befehl "cut" gibbet leider so nicht. Über ed-Skripte hab ich ne ganze Zeit gegooglet, aber nicht viel Verwertbares gefunden... eine Möglichkeit wärs vielleicht, aber ich steck da überhaupt nicht drin in der Materie...

"Und normalerweise kann man Variablen relativ leicht das Ergebnis irgendeiner Programmausführung zuweisen, unter Unix jedenfalls mit backquotes, aber unter DOS geht das IMHO auch..."
Der Hinweis hat mir so leider auch nur wenig gebracht. Auch hier habe ich weder Ahnung noch Anlaufstelle für Lösung.

"Im Notfall schreibt man das Ergebnis in eine Datei und liest es dann zurück."
Ich wählte dann erstmal den Notfall. Mit dir /O:D /B /S /A:D > dir.txt erhalte ich die gewünschte Verzeichnisliste in der dir.txt und zwar so, dass das Verzeichnis mit der jüngsten Datei in der letzten Zeile steht. Das sieht bei mir jetzt also einfach so aus:

C:\temp\V\11
C:\temp\V\10
C:\temp\V\02
C:\temp\V\15
C:\temp\V\09

1. Problem:
Wie schneide ich da jetzt die letzte Zeile raus?
Einen Lösungsansatz schleppte mir Google an:

http://forum.de.selfhtml.org/archiv/2005/6/t108873/#m679045

Hier wurde ein Skript geschrieben, welches die letzte Zeile einer txt-Datei in eine neue schreibt. Leider ist dies Skript fehlerhaft: "Sorry the script didn't work for ya  (I forgot new needed to be changed to CreateObject() )"

Ich habe aber trotz dieses Hinweises es nicht geschafft, das Skript zum Laufen zu bringen.

Ich habe schon versucht, in jenem Forum nachzuhaken, bekomme aber nicht mal die notwendige Registrierungsbestätigungs-Email. :(

Angenommen, es liefe: Kann ich es überhaupt einfach mit in die Batch
schreiben? Ansonsten müsste ja erst die Batch-Datei das VB-Script starten und dieses wiederum die nächste Batch-Datei (wo ich wiederum keine Ahnung von hätte).

2. Problem:
Wenn ich nun endlich das gewünschte Verzeichnis allein in einer Text-Datei (z.B. thedir.txt) habe, wie lese ich es in mein FTP-Upload-Skript?
Bei den FTP-Parameter lcd für das lokale Verzeichnis funktioniert
"lcd C:\temp\V\09", aber nicht
"lcd < thedir.txt", wenn dort nur "C:\temp\V\09" drin steht.

Ich hoffe, mir kann da noch jemand weiter helfen.

Gibt es denn da auch kein kostenloses Fertig-Tool? Ich kann's mir kaum vorstellen, aber per google finde ich nur solche mega-umfangreichen Monitoring-Tools, die auch entsprechend bezahlt werden sollen.

Grüße
Christian

  1. Hallo Christian,

    Ich habe mein Problem, welches ich vor über 2 Monaten schon einmal hier formuliert habe, immer noch nicht gelöst:
    http://forum.de.selfhtml.org/archiv/2005/6/t108873/#m679045

    Bio hat mir ja freundlicherweise ein paar Vorschläge gemacht:

    "Es gibt da wahrscheinlich einen Befehl "cut" - im Notfall tut's ggf. ein ed-Skript (waaaah! Stoneage-Technology!), wo Du die Zeile durchpipst."

    Den Befehl "cut" gibbet leider so nicht. Über ed-Skripte hab ich ne ganze Zeit gegooglet, aber nicht viel Verwertbares gefunden... eine Möglichkeit wärs vielleicht, aber ich steck da überhaupt nicht drin in der Materie...

    Den gibt es schon, nur vielleicht nicht auf den Systemen, auf denen Du das Problem hast :-)

    "Und normalerweise kann man Variablen relativ leicht das Ergebnis irgendeiner Programmausführung zuweisen, unter Unix jedenfalls mit backquotes, aber unter DOS geht das IMHO auch..."
    Der Hinweis hat mir so leider auch nur wenig gebracht. Auch hier habe ich weder Ahnung noch Anlaufstelle für Lösung.

    Betriebssysteme, auf denen das laufen muss?
    [ ] DOS 3.0
    [ ] DOS 6.22
    [ ] Windows 9x
    [ ] Windows NT 3.5x
    [ ] Windows NT 4.0
    [ ] Windows 2000 (Professional oder Server)
    [ ] Windows XP (Home oder Professional)
    [ ] weiteres

    Meine weiteren Ausführungen beziehen sich auf die Shell CMD von Windows 2000 und Windows XP, getestet unter Windows XP Professional.

    "Im Notfall schreibt man das Ergebnis in eine Datei und liest es dann zurück."
    Ich wählte dann erstmal den Notfall. Mit dir /O:D /B /S /A:D > dir.txt erhalte ich die gewünschte Verzeichnisliste in der dir.txt und zwar so, dass das Verzeichnis mit der jüngsten Datei in der letzten Zeile steht. Das sieht bei mir jetzt also einfach so aus:

    C:\temp\V\11
    C:\temp\V\10
    C:\temp\V\02
    C:\temp\V\15
    C:\temp\V\09

    Ist doch schon mal was.

    Wie schneide ich da jetzt die letzte Zeile raus?
    Einen Lösungsansatz schleppte mir Google an:
    http://forum.de.selfhtml.org/archiv/2005/6/t108873/#m679045

    Da hast Du Dich vertan, das ist Dein Archivposting :-)

    Wie könntest Du Dein erstes Ziel erreichen?
    Die Kommandozeile kennt die FOR-Anweisung, in einer Batchdatei in der Form:

    FOR %%Variable IN (Satz) DO Befehl [Parameter]

    Für Satz kannst Du auch die Ausgabe eines Befehls nehmen. Diesen musst Du in einfache Hochkomma setzen, und die Option /F verwenden, z.B:

    FOR /F %%I IN ('DIR /O:D /B /S /A:D') DO Befehl [Parameter]

    Wie kommst Du nun an die letzte Zeile?
    Ganz einfach: Schreibe den Inhalt jeder Zeile in immer die gleiche Variable (genauer Umgebungsvariable). Dazu dient die Anweisung

    SET

    z.B. mit

    FOR /F %%I IN ('DIR /O:D /B /S /A:D') DO SET VERZEICHNIS=%%I

    schreibst Du jede Zeile der Ausgabe in die Variable VERZEICHNIS. Bei jedem Durchlauf überschreibst Du den alten Wert mit dem aktuellen. Am Schluss steht die letzte Zeile der Ausgabe Deines DIR-Befehls drin. Auf solche Variablen greifst Du später mit

    %Variablenname%

    zu.

    Kontrolliere, ob das gewünschte Ergebnis drinsteht, mache eine Testausgabe mit

    ECHO %VERZEICHNIS%

    Angenommen, es liefe: Kann ich es überhaupt einfach mit in die Batch
    schreiben? Ansonsten müsste ja erst die Batch-Datei das VB-Script starten und dieses wiederum die nächste Batch-Datei (wo ich wiederum keine Ahnung von hätte).

    Somit kann das VB-Skript außen vor bleiben, in der Variable

    VERZEICHNIS

    steht das gewünschte drin.

    Wenn ich nun endlich das gewünschte Verzeichnis allein in einer Text-Datei (z.B. thedir.txt) habe, wie lese ich es in mein FTP-Upload-Skript?

    Lesen? Gar nicht, Du schreibst es!

    Im nächsten Schritt erstellst Du Dein Upload-Skript batchgesteuert neu. Dazu verwendest Du den Befehl ECHO, den Du bereits oben kennengelernt hast und die Umleitungen in Dateien mit

    > (in eine neue Datei)
        >> (Anhängen an eine bestehende Datei)

    Wenn Du Deine "upload.txt" neu erstellt hast rufst Du im letzten Schritt das FTP-Kommando auf. Fertig.

    Hier ein erster Code-Ansatz, der Dir den Umgang mit Variablen in der Batchprogrammierung ein wenig näher bringen will:

    @ECHO OFF
    REM Setze benoetigte Variablen
    SET PFAD=c:\temp\v\ SET DATEI=\V000000.htm

    REM Ermittle das Verzeichnis, das zuletzt geaendert wurde
    REM Beachte: Die Variablen in der FOR-Anweisung bestehen aus einem Buchstaben
    FOR /F %%I IN ('DIR /OD /B  %PFAD%*') DO SET VERZEICHNIS=%%I
    ECHO %PFAD%%VERZEICHNIS%%DATEI%

    REM  Baue upload.txt zusammen

    REM Rufe ftp auf

    Abschliessende Anmerkung: Du könntest noch

    setlocal
        endlocal

    verwenden, damit Deine Variablen lokal bleiben.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz!

      Herzlichen Dank für deine umfassende und äußerst hilfreiche Antwort!
      Ich gehe davon aus, dass es zunächst nur auf XP laufen muss - und das tut's; ich hab alles hingekriegt! =)

      Abschliessende Anmerkung: Du könntest noch

      setlocal
          endlocal

      verwenden, damit Deine Variablen lokal bleiben.

      Was passiert denn, wenn ich's nicht verwende?
      Müssen setlocal und endlocal dann die SET FOO=BAR - Befehle umschließen oder wo müssen das hin?

      Grüße
      Christian

      1. Hallo

        Herzlichen Dank für deine umfassende und äußerst hilfreiche Antwort!

        Den nehme ich selbstverständlich gerne entgegen.

        Abschliessende Anmerkung: Du könntest noch
            setlocal
            endlocal
        verwenden, damit Deine Variablen lokal bleiben.

        Was passiert denn, wenn ich's nicht verwende?

        Die Shell, in der Deine Batchdatei ausgeführt wurde, enthält ein paar Umgebungsvariablen mehr - und sobald Du diese Shell schliesst, sind die weg. Andere Shells sind nicht betroffen.

        Müssen setlocal und endlocal dann die SET FOO=BAR - Befehle umschließen oder wo müssen das hin?

        setlocal vor das erste SET, endlocal hinter den letzten Gebrauch einer lokalen Variablen.

        Freundliche Grüße

        Vinzenz

        1. setlocal vor das erste SET, endlocal hinter den letzten Gebrauch einer lokalen Variablen.

          ok, nochmals danke & ciao
          Christian