Batch: handling von Pfaden, Dateinamen und Leerzeichen

  • Hallo Leute,
    ich habe hier ein Problem mit Datei-/Pfadnamen. Und zwar habe ich ein Batchfile geschrieben, was mir Videofiles und Ordner mit EinzelbildSequenzen komprimiert.
    Funktioniert soweit auch ganz gut. Bei den avi files darf jedoch nur der Pfad Leerzeichen haben, sobald der Dateiname ein Leerzeichen hat, funktioniert es nicht mehr. Setzte ich die fehlerhaften Pfad Variablen in """ funktionieren dann die Dateien mit Leerzeichen, aber die ohne funktionieren nicht mehr.
    Habt hier eine Idee, wie ich das hin bekommen kann?

    Hier mal ein Code Ausschnitt:

  • Ich check es irgendwie nicht...
    wenn ich das, per drag&drop, ausführe:

    Code
    set inpath=%1set tok=%inpath:~-1%echo %tok%


    passt alles und ich bekomme bei einem avi file ohne Leerzeichen ein i raus und bei einem avi file mit Leerzeichen ein ".

    Wenn ich jetzt aber das %tok% mit if abfrage, verweigert das Script:

    Code
    if "%tok%"== "i" GOTO weiter

    Edit:
    ok ich habs doch...:

  • oder mache es so

    Zitat

    set "path=%~1"


    das ~ entfernt die "..."


    Quelle: Eingabeaufforderung/Windows Hilfe
    "c:\>for /?" seite 5

    [p.s.]
    set path=%~1 ; hat probleme mit leer-& sonderzeichen
    set path="%~1" ; man hat immer "..." und muss umständlich entfernt werden
    set "path=%~1" ; damit apzeptiert set nun leer-& sonderzeichen, ohne das die variable selber "..." beinhaltet
    die letzte schreibart verwende ich immer, so brauch ich mir darüber keine gedanken mehr machen

    [p.p.s]
    achtung fallstrick:

    Zitat

    if "%~x1" == "" GOTO folder


    auch wenn du keine verzeichnisse mit punkt im namen verwendest, so gibt es sie
    z.B. "Vol.1" "O.S.T." "Dr. X" "S.M.U.D.O." "Tron 2.0" "N.E.R.D." "R.E.M." "V.A. - xxx" "xxx.tmp" "06.09.2011"

    hatte mal ein archiv-pack-script wo dieses problem auftrat, hier ist mein workaround:

    ArbeitsVerzeichnis prüfen (Verzeichnis oder Datei).cmd

    ist ein älteres script, heute könnte man es vielleicht mit %errorlevel% etwas anders gestalten.

  • Hallo HQ-LQ,
    vielen dank, das hat mir sehr weiter geholfen! Auch das mit dem "if "%~1"=="%CD%"" - Habe gar nicht dran gedacht, dass Ordner ja auch Punkte haben können :).

    Hast du hier auch zufällig einen Rat?

    Code
    Z:\PROGRAMME\__GlobalTools\CMDTools\mediainfo --Inform="Video;%%FrameRate%%" %1 >> %~n1_info.tmp
    for /f %%a in (%~n1_info.tmp) do set fps=%%a

    Habe ich in "%~n1_info.tmp" ein Leerzeichen im Namen, wird die Datei in der if-Abfrage nicht mehr eingelesen, auch nicht wenn ich die Variable in Anführungszeichen setzt (dann wird einfach der Variablenname genommen und nicht der Inhalt der Datei).

  • suche mal nach meinen alten beiträgen zu Mpack, der in der signatur ist der falsche
    da hatte ich das problem auch schon...

    edit:
    mist kann den alten beitrag zu mpack nicht mehr finden... scheind wohl draufgegangen zu sein...

    zz bastel ich daran rum, denn man kann jede programmausgabe in einer set-variable speichern,
    wenn man es mit einer for-schleife umhüllt... :P
    zz ärger ich mich mit den sonderzeichen rum... :D

  • ich kann nicht mehr...
    habe zwar einen alten code gefunden

    Code
    FOR /F "Delims=" %%i in ('MediaInfo_CLI.cmd --Inform=General;%%Encoded_Date%% %1') do set xYear=%%i && echo.%%i


    aber der will nicht mehr funktionieren
    ob sich da was geänderthat XP <--> win7 oder der code noch älter ist, als ich glauben mag, weis ich nicht mehr
    ich weis nur noch das was symikolon nicht stimmte...

    ansonnsten kannst du mit findstr werte aus dateien suchen & lesen

    Code
    call MediaInfo_CLI.cmd %1 > ztemp.tmp
    for /f "tokens=2 delims=:" %%i in ('findstr /c:"Performer" ztemp.tmp') do set xArtist=%%i && echo.%%i
  • Wenn man das Ergebnis von MediaInfo direkt in eine Variable schreiben könnte, wäre natürlich sehr cool. Kann aber leider auch erst Morgen wieder testen.
    Das mit findstr kenne ich schon, auch das mit token und delims habe ich mittlerweile gerafft. Jedoch ging es speziell um das Einlesen der Textdaten, die ein Leerzeichen im Dateiname hat. Das hatte ich nicht hin bekommen.

    Wegen den Sonderzeichen: Kannst nicht einfach "chcp 1252" verwenden?

  • Code
    call MediaInfo_CLI.cmd %1 > "ztemp.tmp"for /f "tokens=2 delims=:" %%i in ('findstr /c:"Performer" "ztemp.tmp"') do set xArtist=%%i && echo.%%i

    jo mit "..." einklammern

    aber ich empfehle nicht für eine temporäre datei komplizierte namen zu verwenden.
    wenn man trozdem unabhänige tempdateien haben will,
    dann verwende einen festen namen kombiniert mit einem zufallswert, welcher dir die variable %Random% lefert
    z.B. "xMedi-FindMe_943671.tmp"
    der feste name ist entscheidend, denn es fehlt noch eine löschroutine um den datenmüll wieder zu vernichten.

    %Random% hat einen kleinen schönheitsfehler, wenn man 2 instanzen zeitgleich startet,
    dann ermitteln beide die selbe zufallszahl.
    ich glaub das problem kann man lösen, indem man die prozess-id mit verwendet...

    am einfachsten ist für für temporäre dateien das benutzer-temp-verzeichnis %temp% zu verwenden,
    da hat man immer einen ort den man notfalls komplett löschen kann...

    ...hab ich schon von mein cleaning-script erzählt!?
    die codezeilen kannst du dir ruig mal anschauen,
    generell empfehle ich jedes script mal anzuschauen was du findest...
    ...nicht das ein böser schelm unfug treibt... XD

    also meine empfehlung währe:

    Code
    set "xMdIfo=x:\Program Files\Mediainfo\MediaInfo.exe"
    set "xTmpFile=%temp%\zMidIfo-tag.%random%.tmp"
    
    
    "%xMdIfo%" %1 > "%xTmpFile%"
    for /f "tokens=2 delims=:" %%i in ('findstr /c:"Performer" "%xTmpFile%"') do set xArtist=%%i
    
    
    echo.Artist^:  %xArtist%
  • Das ganze in "..." setzen ging eben nur beim Schreiben in die Datei, beim auslesen wollte er das leider nicht akzeptieren. Ich hätte das ganze eben gerne mit %~n1... gelöst, damit das Script auch mehrmals ausgeführt werden kann, ohne dass etwas Überschrieben wird. Und so fand ich es halt etwas schöner, weil alles in einem Guss ist. Zurzeit habe ich mir mit:
    set dat=%date%_%time:~3,2%-%time:~6,2%
    Eine Variable gebastelt, die dem %Random% wohl recht nahe kommt (wobei dieser auch sehr cool ist, kannte ich bei Batch noch nicht ;)). Ist eben auch noch nicht so "schön".

    Hier mal noch das ganze Script:
    mp4_Compression_v0.6.bat.zip
    Vielleicht braucht es ja wer.
    Konvertieren lassen sich damit Video Files, Ordner mit Frame Sequenzen (Nummerierung muss 4stellig sein) und OpenEXR Files. Alles nach mp4 - x264. Für openEXR würde imf_copy benötigt werden... Andere Lösung habe ich nicht hin bekommen. Ansonsten wird ffmpeg, mp4crator, MediaInfo CLI und Avisynth benötigt.

  • nunja ich favorisiere halt temp-random, weil ich schon an die grenzen des dateisystems (ntfs) gestoßen bin
    1# die maximale dateilänge, weil ich ja immer katiogiesieren & exat bezeichenen muss
    2# bezeichenen... da mehme ich es sehr genau, die zeichentabelle ist mein freund, wenn ich mal wieder japanische oder alternative systemzeichen suche...
    "E:\L\MUSIC\$Asian\.ELECTRONIC\IOSYS\IOSYS - 2006 - Touhou Otome Bayashi\IOSYS - 東方乙女囃子 - 06 - 十六夜咲夜は穿いていないのか?.mp3"

    ein date-creator ist auch un meinem snapshot-script
    ich glaube das ist das erste was ein jeder per batch programiert XD

    so weil ich ja auch immer nach kommentatoren zu meinen codequark heule...
    so werde ich mich mal an meine eigene nase fassen und ein paar fragmentierte kommentare/gedanken ablassen...

    was für ne wurst an gelaber... hat das board eine hide/spoiler funktion?
    kann da nix finden...

  • Oh weh,du hast Dir echt die Mühe gemacht und alles angeschaut und kommentiert?! Ich danke dir! Werde ich mir in Ruhe durchschauen!

    Zu:

    [quote='HQ-LQ','AW: Batch: handling von Pfaden, Dateinamen und Leerzeichen kann nicht mehr...
    habe zwar einen alten code gefunden

    Code
    FOR /F "Delims=" %%i in ('MediaInfo_CLI.cmd --Inform=General;%%Encoded_Date%% %1') do set xYear=%%i && echo.%%i


    aber der will nicht mehr funktionieren
    ob sich da was geänderthat XP <--> win7 oder der code noch älter ist, als ich glauben mag, weis ich nicht mehr
    ich weis nur noch das was symikolon nicht stimmte...


    Versuche es mal so, das funktioniert bei mir zumindest:

    Wichtig sind die "^", sonst interpretiert das Batchscript Zeichen die es nicht soll da die für Mediainfo gedacht sind.

  • Z 32#
    die prüfroutinen würde ich überarbeiten

    Code
    :checkif exist "%windir%\SysWOW64\avisynth.dll" GOTO checkToolsif not exist "%windir%\System32\avisynth.dll" GOTO Avisynth:Avisynth


    und wenn System32\avisynth.dll existiert?
    dann greift die regel nicht und er will trozdem avisynth installieren (endlosschleife)

    if regeln sind ein harte sache...
    je mehr sie werden und wenn 'if' und 'if not' ständig wechselt...
    versuche sowas zu meiden und verwende wenn es geht 'if x (do) else (do)'
    das währe mein vorschlag:

    Code
    :checkif exist "%windir%\SysWOW64\avisynth.dll" (GOTO checkTools) else (GOTO Avisynth)if exist "%windir%\System32\avisynth.dll" (GOTO checkTools) else (GOTO Avisynth):Avisynth

    --------------------------------------------------------------------------------

    - "echo. Bla" schinst du wohl nicht zu mögen ^^

    --------------------------------------------------------------------------------

    Z 14#
    ich würde das ganze zu ein paket schnüren, wo im stammverzeichnis das script liegt,
    dann kann man das programmverzeichnis schön portabel machen,
    indem man die pfade relativ gestaltet. so brauch der user nicht das script bearbeiten. :P

    Code
    :: Install Path ----------------------------set "InstallPath=%~dp0CMDTools"


    achtung die variable %~dp0 erzeugt ein pfad mit einem "\" am ende.
    übrigens habe ich für die aufgegliederte variable ne nette eselsbrücke:

    Code
    %1 = "%~1" = "%~dpnx1"[B]d[/B]:\[B]p[/B]rogramme\[B]n[/B]ame.e[B]x[/B]tention

    ---------------------------------------------------------------------------------

    Z 53#

    das werde ich dir jetzt nicht empfehlen umzusetzen,
    aber ich werde dir mal aufzeigen wie es ausarten kann.

    ich habe für mein MPack script einen DAU kompatiblen installer gestrickt
    der sich erstmal 7zip & wget besorgt
    (das sind die einzigsten arbeitsschritte, die der DAU z.t. manuell durchführen muss)

    heute würde ich das mit call machen

    -----------------------------------------------------------------

    man kann auch statt
    GOTO next
    GOTO :next
    schreiben, ich verwende ich, well man die sprungbefehle so schneller findet
    ist ne optische sache... ehr unwichtig :P

    ----------------------------------------------------------------------

    ping 127.0.0.0 -n 5 sind nicht 5 sekunden.
    miss nach, das ändert sich je nach pc, leistung bzw. last
    aber wer streitet sich schon um sekunden :D

    ----------------------------------------------------------------------

    ich bin beeindruckt.
    das script war schon allein angenehmer zu lesen.
    ich muss aufpassen, dass du mir nicht meinen script-kiddy-rang abnimmst... XD

    ---------------------------------------------------------------------

    nachtrag zur versionierung
    ich habe mich vom multi-nummern-zähler system verabschiedet (v0.6.98.12664.136459775412368578854-fix3)
    und bin jetzt zum zeitstempel system gewechselt ( [2011-09-10] ) & gewürzt mit alpha, beta, fix1 ...
    so weis jeder bescheid (hoffendlich ^^ )
    alternativ reicht auch einfach eine buildnummer die man hochzählt (b5691)

    also solange man kein projekt stemmt,
    wo mehrere leute mit dran rumfuschen sollte das völlig ausreichen...

    ein link zur quelle des scrips währ auch nicht verkehrt,
    wie z.b. die url von diesem thread
    http://forum.gleitz.info/showthread.php?45038 (den ganzen anhang-gedöhns braucht man nicht)

  • übrigens habe ich meinen fehler gefunden mit MediaInfo
    da ich dieses programm per MediaInfo_CLI.cmd script aufrufe
    musste ich für die variablenübergabe auch schon dort die sonderzeichen markieren

    hier ist das was ich meine

    Code
    call MediaInfo_CLI.cmd --Inform=General;[B]%[/B]%[B]%[/B]%FileName[B]%[/B]%[B]%[/B]% %1
      .\0.7.47\Win64_CLI\MediaInfo.exe --Inform=General;%%FileName%% %1

    übrigens geht das nur per %% statt ^%
    tya cmd ist buggy... durch und durch

    und warum ich so eine spielerei mache
    das sieht man vielleicht schon am pfad
    (ja auch mediainfo ist meiner katalogirierungs orgie zum opfer gefallen)

    eigendlich beginnt sowas immer wenn ein stupiedes updaten ein programm unbrauchbar macht
    hier brauch ich nur noch die versionsnummer im loaderscript ändern und schon geht es wieder
    und das ganze ohne regestrypfade neu setzen zu müssen

    alternativ könnte man ein hauptunterverzeichnis "BIN\" nutzen,
    aber das würde schon wieder unnötigen speicher belegen

    hardlinks sind da aufwändiger brauchen per script auch noch adminrechte...

    ...man ich könnte meine Batch-Memoiren schreiben XD
    n bissel eigenironie muss sein...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!