Batch for ciklusba relatív útvonalat

Címkék
Batch for ciklusba relatív útvonalat
2013-04-24T16:38:57+02:00
2013-04-25T10:55:15+02:00
2022-11-28T21:55:37+01:00
NemTom
Összehasonlítani szeretnék, két külön mappában lévő azonos relatív útvonalú és nevű fájlokat.

SET dirA=c:\test\1 SET dirB=c:\test\2 for /R "%dirA%" %%f in (*.*) do ( if exist %dirB%%%f echo file ok: %dirB%%%f )

Sajnos ez így nem jó, mert nem relatív útvonalt ad vissza a %%f és hiába adom hozzá a másik %dirB% path-hoz érvénytelen lesz.
pl: "c:\test\2c:\test\1\xx\valami.txt"

Hogyan lehetne az induláshoz képest relatív path-hoz jutni?

Vagy módosítani a stringet?
kicserélni benne elejétől %dirA% %dirB%-re.?

Az eredeti: c:\test\1\xx\valami.txt
cserélni c:\test\2\xx\valami.txt-re
akkor már használható lenne :)
Mutasd a teljes hozzászólást!
Bocs elnézést kérek. Ne értsd félre nem akarlak bántani.


Semmi gond, nincs harag

A setlocal EnableDelayedExpansion azért nem írtam bele mert nálam nem működik sem a batch fájl elején, sem pedig a ciklusban. A realpath változónak nem ad értéket


Közben elolvastam újra a kódodat, és szerintem rájöttem, mi a hiba. Az echo-ban is felkiáltójel közé kell raknod a realpath-ot.

A magyarázat: a normál, százalékjelek közti változóreferencia a parancs végrehajtása előtt cserélődik ki. Mivel az egész FOR számít egy parancsnak, a ciklusmagban minden kifejtődik még az abba való belépés előtt. Ha viszont felkiáltójelek közé rakod a változót (és bekapcsolod ezt a funkciót a "setlocal EnableDelayedExpansion") sorral, akkor a változó késleltetve fejtődik ki, közvetlenül a felhasználása előtt, vagyis minden iterációban képes vagy különböző értékeket adni ugyanannak a változónak, és ezt az értéket rendesen fel is használni.
Mutasd a teljes hozzászólást!

  • (Szerintem telepíts bash-t. pl)
    Mutasd a teljes hozzászólást!
  • Ebből a StackOverflow témából kiindulva valami ilyesmi fog kelleni:
    setlocal EnableDelayedExpansion SET dirA=c:\test\1 SET dirB=c:\test\2 for /R "%dirA%" %%f in (*.*) do ( set dummy=%%f set relativepath=!dummy:*%dirA%=! if exist %dirB%!relativepath! echo file ok: %dirB%!relativepath! )

    De én a helyedben megfogadnám NevemTeve tanácsát. A Windows batch nyelv egy őskövület, amit utólag foltozgattak össze-vissza; ha nem akarod kitépni a hajadat (vagy idő előtt kihullajtani), akkor állj át valami jobb shellscript-nyelvre, bash-re vagy PowerShell-re, vagy ami szimpatikus.

    Persze ha nem csak magadnak kell a cucc, hanem random Windows gépen futnia kell, akkor nem nagyon van választási lehetőség. Bár talán még akkor is lehet Visual Basicben vagy Javascriptben szkriptelni a Windowst, csak ahhoz nem értek.
    Mutasd a teljes hozzászólást!
  • Hát ez a bash katasztrófa. Van hozzá minden leírás példák de csak is 100%-ban linuxhoz

    Miért nem listázza a mappák tartalmát?
    #!/bin/bash FILES="c:\test\*.*" for entry in $FILES do echo "$entry" done

    vagy
    for f in $(find c:\test\ -name '*.*'); do echo $f; done
    Mutasd a teljes hozzászólást!
  • Hát ez a bash katasztrófa. Van hozzá minden leírás példák de csak is 100%-ban linuxhoz

    Ha te tudnád, hogy ilyenkor milyen jó a CygWin.
    Mutasd a teljes hozzászólást!
  • Bash ekkora hülyeséget!
    Windows környezetben nem lehet windows-os path-ot használni!!!
    Miközben a script-ek 90% fájl művelet!

    Mind1!
    Vissza batch fájlhoz
    SET dirA=c:\test\1 SET dirB=c:\test\2 for /R "%dirA%" %%f in (*.*) do ( set realpath=%%f set realpath=!realpath:*%dirA%=%dirB%! echo file : %realpath% )
    Ez elméletileg működik, gyakorlatilag pedig hibás.
    Mert a ciklus alatt nem lehet írni változót.

    már csak ezt kéne megoldani
    Mutasd a teljes hozzászólást!
  • Bash ekkora hülyeséget!


    Elnézést, hogy segíteni próbáltam. Ígérem, többet nem fordul elő...

    Ez elméletileg működik, gyakorlatilag pedig hibás.
    Mert a ciklus alatt nem lehet írni változót.


    Akkor biztos az én gépem hibás, hogy azon meg működik. Talán köze van a "setlocal EnableDelayedExpansion" sorhoz, ami az én kódomban benne van, a tiédben meg nem.
    Mutasd a teljes hozzászólást!
  • Bocs elnézést kérek. Ne értsd félre nem akarlak bántani.

    A setlocal EnableDelayedExpansion azért nem írtam bele mert nálam nem működik sem a batch fájl elején, sem pedig a ciklusban. A realpath változónak nem ad értéket

    Nem az a gondom, hogy jó szándékkal segítenek az emberek.
    Mert ez nem segítség, nem a te hozzászólásodra gondolok hanem a másik kettőre.
    Ha ÉN egy adott témakörben felvetek egy kérdést akkor abban a témakörben szeretném a választ!
    Ha valaki jó szándékkal felvet egy másik rendszert ezzel semmi gondom sincs. De ne csak a nevét írja le hanem akkor adjon hozzá egy pársoros példát amiből el lehet indulni normálisan.
    És ne én basszak el órákat az éltemből hogy rájöjjek hogy amit tanácsoltak az lehet hogy nem is nekem való.
    Mert meg kéne tanulni a használatához a linuxos logikát.

    Egyébként tetszik a Bash elég egyszerű és szépen átlátható, csak a windows fájlkezeléssel van problémám.
    Mutasd a teljes hozzászólást!
  • Bocs elnézést kérek. Ne értsd félre nem akarlak bántani.


    Semmi gond, nincs harag

    A setlocal EnableDelayedExpansion azért nem írtam bele mert nálam nem működik sem a batch fájl elején, sem pedig a ciklusban. A realpath változónak nem ad értéket


    Közben elolvastam újra a kódodat, és szerintem rájöttem, mi a hiba. Az echo-ban is felkiáltójel közé kell raknod a realpath-ot.

    A magyarázat: a normál, százalékjelek közti változóreferencia a parancs végrehajtása előtt cserélődik ki. Mivel az egész FOR számít egy parancsnak, a ciklusmagban minden kifejtődik még az abba való belépés előtt. Ha viszont felkiáltójelek közé rakod a változót (és bekapcsolod ezt a funkciót a "setlocal EnableDelayedExpansion") sorral, akkor a változó késleltetve fejtődik ki, közvetlenül a felhasználása előtt, vagyis minden iterációban képes vagy különböző értékeket adni ugyanannak a változónak, és ezt az értéket rendesen fel is használni.
    Mutasd a teljes hozzászólást!
  • Tökéletes köszönöm!

    setlocal EnableDelayedExpansion SET dirA=c:\test\1 SET dirB=c:\test\2 for /R "%dirA%" %%f in (*.*) do ( set realpath=%%f set realpath=!realpath:*%dirA%=%dirB%! echo fájl : !realpath! echo csak filenév : %%~nxf )
    Mutasd a teljes hozzászólást!
  • Mert Unix-ban a backslash mást jelent, a / az elválasztójel:

    FILES="c:/test/*"
    de még inkább, gondolva arra az esetre is, hogy sok fájlod van, vagy szóköz is lehet a nevükben:

    ls -1 c:/test/ | while read F; do EGYIK="c:/test/$F" MASIK="c:/temp/ujhely/$F" printf "Csinalj valamit EGYIK=%s MASIK=%s\n" "$EGYIK" "$MASIK" done

    "Ezek voltak az első lépések, Luke, egy tágabb világegyetem felé vezető úton"
    Mutasd a teljes hozzászólást!
  • Nagyon szépen köszönöm a példát.
    Így már érthetőbb miért nem működött
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd