WebHU - Programozási kérdések és válaszok

hogyan kell végrehajtani a .bat fájlt egy .bat fájlon belül, különböző útvonallal?

Több .bat fájllal dolgozom több helyen, és szeretném a teljes munkát egy munkában összekapcsolni. Tehát itt a probléma:

Van egy A A1 nevű mappám, és benne van egy .bat fájl, amely a szintén ugyanabban a mappában lévő fájllal működik. Aztán ott van a A B1 mappa ugyanazzal a beállítással. Példa:

  • W:
    • PROJÉČŤ
      • A A1
        • @ START BAT.bat
        • FILE.avi (ami 60 MB)

és

  • K:
    • PROJÉČŤ
      • A B1
        • @ START BAT.bat
        • FILE.avi (ami 80 MB)

Kérjük, vegye figyelembe a különböző meghajtókat!

Tehát ezen a ponton szeretném futtatni a W:\PROJÉČŤ\A A1\@ START BAT.bat fájlt, és amikor ez a kötegfájl végrehajtotta az összes írt parancsot, automatikusan el akarom indítani a második kötegfájlt K:\PROJÉČŤ\A B1\@ START BAT.bat az elsőből W:\PROJÉČŤ\A A1\@ START BAT.bat

Saját kötegelt szkriptjeim:

W:\PROJÉČŤ\A A1\@ START BAT.bat

IF EXIST "*.avi" (
    IF NOT EXIST "FILE.avi" (
        REN "*.avi" FILE.avi
    )
    ATTRIB -R "FILE.avi"
    IF EXIST "FILE.avi" (
        ATTRIB -R "FILE.avi"
    )
)
REM ???
PAUSE
EXIT 

K:\PROJÉČŤ\A B1\@ START BAT.bat

IF EXIST "*.avi" (
    IF NOT EXIST "FILE.avi" (
        REN "*.avi" FILE.avi
    )
    ATTRIB -R "FILE.avi"
    IF EXIST "FILE.avi" (
        ATTRIB -R "FILE.avi"
    )
)
PAUSE
EXIT

Azt hiszem, csak le kell cserélnem a sort a REM ???-ra egy hasonló paranccsal

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

De az alább felsorolt ​​parancsok sajnos nem működtek:

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"
CALL "K:\PROJÉČŤ\A B1\@ START BAT.bat"
START CALL "K:\PROJÉČŤ\A B1\@ START BAT.bat"
START cmd /K CALL"K:\PROJÉČŤ\A B1\@ START BAT.bat"

A K:\PROJÉČŤ\A B1 könyvtárban lévő kötegfájl nem a W:\PROJÉČŤ\A A1 könyvtár kötegfájljából lett végrehajtva.

Valami ötlet, kérem?

27.12.2015

Válaszok:


1

Ne nevezzen el egy kötegfájlt úgy, mint a Windows parancsfeldolgozó belső parancsát vagy a Windows system32 könyvtárában tárolt szabványos Windows konzolalkalmazást. A @ START BAT.bat határozottan nem jó név kötegfájlnak, mert tartalmazza a start parancsot, szóközt tartalmaz a fájlnévben, és a @ is nagyon szokatlan a fájlnevekben, ami az oka annak, hogy sok évvel ezelőtt ezt a karaktert választották elválasztóként az e-mail címekben.


A "W:\PROJÉČŤ és "K:\PROJÉČŤ minden almappájában egy nem FILE.avi FILE.avi nevű AVI-fájl átnevezése (remélhetőleg) és az írásvédett attribútum eltávolítása elvégezhető a következő kötegkóddal a AviFileRename.bat mappába mentve:

@echo off
call :AviFileRename "W:\PROJÉČŤ"
call :AviFileRename "K:\PROJÉČŤ"
goto :EOF

:AviFileRename
for /R %1 %%# in (*.avi) do (
    if /I "%%~n#" == "FILE" (
        %SystemRoot%\System32\attrib.exe -r "%%#"
    ) else (
        ren "%%#" "FILE.avi"
        %SystemRoot%\System32\attrib.exe -r "%%~dp#FILE.avi"
    )
)

Nem számít, hogy a AviFileRename.bat melyik könyvtárba van mentve ezekkel a kódsorokkal.

A használt parancsok és működésük megértéséhez nyisson meg egy parancssori ablakot, hajtsa végre a következő parancsokat, és nagyon figyelmesen olvassa el az egyes parancsokhoz megjelenő összes súgóoldalt.

  • attrib /?
  • call /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • ren /?

A hívás parancs általában a fő köteg feldolgozásának folytatására használható egy alkötegben, és amikor az alköteg feldolgozása befejeződött, folytassa a fő köteg feldolgozását. Részletekért olvassa el a választ: Hogyan hívhat meg kötegelt fájlt az aktuális kötegfájl szülőmappájában?

A /B opció nélküli exit parancs azonban a teljes parancsfolyamat kilépését eredményezi, nem csak az aktuális kötegfájl feldolgozását. Részletekért olvassa el a következő választ: Windows kötegfájlban végrehajthat-e olyasmit, amely nem egy másik kötegfájl. ? És olvassa el a súgó kimenetét, amikor fut egy parancssori ablakban (exit /?). A megoldás az, hogy a start paranccsal futtassa a kötegfájlt egy új parancsfolyamatban.

De csak használ

START "K:\PROJÉČŤ\A B1\@ START BAT.bat"

nem elég, mert

  1. A start parancs az idézőjelben lévő első karakterláncot nem kötelező címként értelmezi – a részletekért futtassa a parancssori ablakban start /?;

  2. az aktuális könyvtár nincs beállítva az elindított kötegfájl könyvtárára, amint azt a K:\PROJÉČŤ\A B1 @ START BAT.bat sorai megkövetelik.

A működő parancssor a következő lenne:

start "Processing A B1" /D"K:\PROJÉČŤ\A B1" "K:\PROJÉČŤ\A B1\@ START BAT.bat"

Ez a parancs a REM paranccsal a W:\PROJÉČŤ\A A1\@ START BAT.bat-ba kerül sor helyett.

A paraméterek magyarázatát lásd a start /? kimenetében:

  1. "Processing A B1" ... az új folyamatablak címe. Lehetséges egy üres karakterlánc is, amelyet a "" karakterlánc határoz meg. De valami, amit az ember is olvashat ablakcímként, mindig jobb, mint egy cím nélküli konzolablak. Ha a parancssorban bármilyen más paramétert dupla idézőjelekkel adunk meg, akkor meg kell adni a címet.

  2. /D"K:\PROJÉČŤ\A B1" ... meghatározza az új parancsfolyamat munkakönyvtárát.

  3. "K:\PROJÉČŤ\A B1\@ START BAT.bat" ... az indítandó parancs / végrehajtható / szkript ebben az esetben a @ START BAT.bat kötegfájl a K:\PROJÉČŤ\A B1 könyvtárban.

Érdemes lehet a /D"K:\PROJÉČŤ\A B1" után hozzáadni a /wait start paramétert, hogy a kötegfájlt az új parancsfolyamatban futtassa, és a W:\PROJÉČŤ\A A1\@ START BAT.bat feldolgozását mindig leállítsa, amíg az elindított kötegfájl be nem fejeződik, és a parancsfolyamat ki nem fejeződik a paranccsal. kilépést, vagy amikor a kötegfájl utolsó sorát feldolgozta a parancsfeldolgozó.


De van még egy probléma a PROJÉČŤ mappanévvel. Nem ASCII karaktereket tartalmaz ÉČŤ, ezért fontos, hogy a kötegfájl szerkesztésére használt szövegszerkesztőben a megfelelő kódlap legyen beállítva, különben a PROJÉČŤ könyvtár nem található. A konzolablak kódlapja a Windows régiótól és nyelvi beállításaitól függ.

Ha egy parancssori ablakban futtatja a chcp parancsot, akkor megjelenik a parancsfolyamatokhoz meghatározott kódlap a gépén. Ezt (általában) az OEM kódlapot kell használni a szövegszerkesztőben is, nem pedig az ANSI (Windows) kódlapot, amelyet a szövegszerkesztő általában használ szövegfájlok szerkesztéséhez.

27.12.2015
  • Nos, az egész start /?-et elolvastam, és még mindig nem tudom, honnan származik a "Processing <folder>". Ez valami nem említett alparancs? 30.12.2015
  • A title karakterlánc nem kötelező. A start azonban az első dupla idézőjeles karakterláncot mindig címkarakterláncként értelmezi, ezért gyakran meg kell határozni egy címkarakterláncot. Futtassa a parancssori ablakból start "K:\PROJÉČŤ\A B1\@ START BAT.bat", és láthatja, hogy a kötegfájl futtatása helyett csak egy új konzolablak nyílik meg K:\PROJÉČŤ\A B1\@ START BAT.bat címmel. Ez az oka a "Processing A B1" címkarakterláncnak, amely lehet "" vagy "Judge Dredd" is. 30.12.2015
  • köszönöm! a @ karakter elhagyására vonatkozó javaslata a CHCP 1250 > NUL 2>&1 és START "<title>" /D"<folder>" /WAIT "<path>" /ABOVENORMAL használatával megoldotta a problémámat 30.12.2015
  • csak arra vagyok kíváncsi, mit kell tennem az almappában lévő köteg végrehajtásához? próbáltam: START "subfolder name is AA" /D"AA" /WAIT "AA\start bat.bat" de nem szerencsésen 03.01.2016
  • Az aktuális könyvtár /D"AA" az új parancsfolyamat AA almappájával rendelkezik. Ebből a mappából kiindulva a "AA\start bat.bat" új parancsfolyamat nem fog működni, mivel valószínűleg nincs több AA almappa az aktuális AA mappában. Szükséged lesz: START "subfolder name is AA" /D"AA" /WAIT "start bat.bat". A kötegfájl vagy a teljes elérési úttal vagy az új parancsfolyamathoz munkakönyvtárként beállított könyvtárhoz viszonyított elérési úttal hivatkozik. 03.01.2016

  • 2

    Rendben van, ha szóközök vannak a fájlnévben, és a @ nem olyan karakter, amelyet ki kell cserélni. Ennek ellenére néha sokkal könnyebb elnevezni a kötegfájlokat speciális karakterek vagy szóközök nélkül, és kötőjeleket használni a szavak között, például my-cool-script.bat.

    Íme egy példa, amelynek utánoznia kell, amit csinál, és ez segít a szkriptek hibakeresésében.

    Directory of L:\test
    
    12/27/2015  11:12 AM    <DIR>          .
    12/27/2015  11:12 AM    <DIR>          ..
    12/27/2015  11:12 AM               118 @ start one.bat
    12/27/2015  11:08 AM                56 @ start two.bat
    
    L:\test>"@ start one.bat"
    ONE
    Running "@ start one.bat"
    Calling @ start two.bat
    TWO
    Running "L:\test\@ start two.bat"
    Bye from "L:\test\@ start two.bat"
    Bye from "@ start one.bat"
    

    És itt van a kötegfájlok tartalma:

    L:\test>type *.bat
    
    @ start one.bat
    
    
    @echo off
    echo ONE
    echo Running %0
    echo Calling @ start two.bat
    call "L:\test\@ start two.bat"
    echo Bye from %0
    
    @ start two.bat
    
    
    @echo off
    echo TWO
    echo Running %0
    echo Bye from %0
    

    Ez akkor is működik, ha a fájlok különböző könyvtárakban vannak:

    Directory of L:\test
    
    12/27/2015  11:35 AM    <DIR>          one
    12/27/2015  11:35 AM    <DIR>          two
    
    Directory of L:\test\one
    
    12/27/2015  11:35 AM               116 @ start one.bat
    
    Directory of L:\test\two
    
    12/27/2015  11:35 AM                54 @ start two.bat
    
    L:\test>"one\@ start one.bat"
    ONE
    Running "one\@ start one.bat"
    Calling @ start two.bat
    TWO
    Running "L:\test\two\@ start two.bat"
    Bye from "L:\test\two\@ start two.bat"
    Bye from "one\@ start one.bat"
    

    És az első bat fájl frissített tartalma:

    L:\test>type "one\@ start one.bat"
    @echo off
    echo ONE
    echo Running %0
    echo Calling @ start two.bat
    call "L:\test\two\@ start two.bat"
    echo Bye from %0
    

    Egy másik frissítés, amely bemutatja, hogyan lehet hivatkozni a szkript aktuális könyvtárára, nem csak a szkript indulásának „aktuális könyvtárára”.

    %~dp0 itt a kulcs...

    L:\test>dir /s
    Directory of L:\test
    12/27/2015  03:12 PM    <DIR>          one
    12/27/2015  03:12 PM    <DIR>          two
    
    Directory of L:\test\one
    12/27/2015  03:17 PM               170 @ start one.bat
    12/27/2015  03:12 PM                 8 file.txt
    
    Directory of L:\test\two
    12/27/2015  03:17 PM               104 @ start two.bat
    12/27/2015  03:12 PM                13 file.txt
    

    EGY

    @echo off
    echo ONE
    echo Running %0
    echo From Directory: %~dp0
    echo Calling @ start two.bat
    dir "%~dp0\file.txt"
    call "L:\test\two\@ start two.bat"
    echo Bye from %0
    

    KETTŐ

    @echo off
    echo TWO
    echo Running %0
    echo From Directory: %~dp0
    dir "%~dp0\file.txt"
    echo Bye from %0
    

    KIMENET

    L:\test>"one\@ start one.bat"
    ONE
    Running "one\@ start one.bat"
    From Directory: L:\test\one\
    Calling @ start two.bat
    
    Directory of L:\test\one
    
    12/27/2015  03:12 PM                 8 file.txt
               1 File(s)              8 bytes
    
    TWO
    Running "L:\test\two\@ start two.bat"
    From Directory: L:\test\two\
    
    Directory of L:\test\two
    
    12/27/2015  03:12 PM                13 file.txt
               1 File(s)             13 bytes
    Bye from "L:\test\two\@ start two.bat"
    Bye from "one\@ start one.bat"
    
    L:\test>
    

    Mindennek rendelkeznie kell a szkriptek javításához.

    27.12.2015
  • nos, amit leírtál, két denevér fut ugyanabból a mappából/helyről, szóval... nem igazán az én esetem 27.12.2015
  • Frissítettem a példámat 2 különböző könyvtárra, és a call "L:\test\two\@ start two.bat" vagy call "W:\test\two\@ start two.bat" ugyanúgy fog működni. Próbáltad már futtatni a példáimat a gépeden, hogy megoldja az eredeti kérdést, amit feltettél, hogy hogyan lehet 2. szkriptet hívni az 1. szkriptből? 27.12.2015
  • igen, kipróbáltam a példádat, de nem ez az, amit keresek, mert a 2. denevér az első ütőn keresztül kerül végrehajtásra, ahelyett, hogy új, külön végrehajtást végezne. a példádban a FILE.avi fájllal dolgoznék (ami 60 MB), majd automatikusan elindítaná a 2. köteget, ami szintén működne a FILE.avi fájllal (ami 60 mb) a FILE.avi (ami 80 mb) helyett. 28.12.2015
  • Rendben, nem ez volt az eredeti kérdésed, de úgy látom, ez volt az a probléma, amelyet esetleg megpróbáltál megoldani. Frissítem a válaszomat, és megmutatom, hogyan használhatja a változó módosítókat annak biztosítására, hogy a fájl elérési útját használja a fájl.txt helyett. A for /? jó példákat mutat be ezek használatára. 28.12.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..