Batch- mappában lévő fájlok számlálása beírva fájlokba

Batch- mappában lévő fájlok számlálása beírva fájlokba
2019-05-07T13:54:36+02:00
2019-05-08T14:13:14+02:00
2022-10-15T21:41:36+02:00
ChDeep
Sziasztok!
Olyan bach scriptet szeretnék, ami egy mappában minden filehoz hozzáírja a sorszámát. Én konkrétan minden fájlban egy adott karaktersorhoz hozzá szeretném íratni, hogy az hanyadik fájl a mappában..., De akár a nevébe is lehet íratni, mind1 vagy csak adja meg egy változóban, és majd kezdek vele valamit.
Nos azt gondoltam, hogy for ciklusban felszámolom, hogy hány file van és a ciklus futása közben beolvasok a fileba és beillesztem az aktuális számláló állást, de sajna nem megy. Amit eddig csináltam:
@echo off
for %%B in (*.dat) do (
rem set /a cnt+=1
"Y:\fnr\fnr.exe" --cl --dir "%CD%" --fileMask "%%B" --find "PART," --replace "PART,%cnt%"
)
Így viszont minden a mappában lévő fájlba ugyan azt a sorszámot (1)-et adja hozzá.
Köszi!
Mutasd a teljes hozzászólást!
A dir /b /s ilyen sorokat ad vissza:

C:\Proba4\valami\Doc

Szerintem a c:\-től akad ki az fnr.exe.
Mutasd a teljes hozzászólást!

  • Nekem ez így működött:

    @echo off setlocal enabledelayedexpansion set cnt=1 for %%B in (*.dat) do ( echo "Y:\fnr\fnr.exe" --cl --dir "%CD%" --fileMask "%%B" --find "PART," --replace "PART,!cnt!" set /a cnt=cnt+1 )
    Mutasd a teljes hozzászólást!
  • Egyébként pedig ajánlani tudom, hogy inkább térj át a Powershell használatára. Én is így tettem, ma már nem is írok batch fájlokat, annyival jobban kézre áll a Powershell.
    Mutasd a teljes hozzászólást!
  • 1.) A cnt változó hol kap kezdőértéket?
    2.) Ha csak kiprinteled a változót az outputra, akkor működik (növekszik)?
    3.) Tudod-e mit csinál a rem?
    Mutasd a teljes hozzászólást!
  • Bocs, az egyik sor elején ott maradt az echo, az persze nem kell a scriptbe.
    Mutasd a teljes hozzászólást!
  • Szia!
    Köszönöm szépen,. közben elindultam egy másik szállon ami működik is.
    Azonban azt szeretném elérni, hogy ez subdirben is fusson.
    Ezt sikerült összehoznom tömbbel:
    @echo off
    SetLocal EnableDelayedExpansion
    SET /a num = 0
    FOR /F "tokens=*" %%a IN ('dir /b *.dat') DO (
    SET /a num = num + 1
    SET var!num!=%%a
    rem CALL ECHO !num! %%var!num!%%
    CALL "Y:\fnr\fnr.exe" --cl --dir "%CD%" --fileMask "%%var!num!%%" --find "PART," --replace "PART,!num!"
    )
    EndLocal DisableDelayedExpansion
    exit /b

    Ezt, vagy az előzőt lehetséges volna almappásítani? (AZ FNR-be tudom a kapcsolót, de ha bíírom a dir hez a /s kapcsolót, akkor hibát dob). Van erre valami ötlet?
    Mutasd a teljes hozzászólást!
  • Szia!
    Sorry, kezdőértéket tényleg kimaradt, de kapott, a remet tudom mi,  véletlen maradt bent, még a setlocal enabledelayedexpansion is benne volt, csak kiválasztás-beillesztésnél elbalfaszoskodtam,  mert már rommá írtam a scriptet és ide csak az alapot akartam posztolni. De látod Kapitány így is vette a lapot.
    Mutasd a teljes hozzászólást!
  • Szerintem az okozhatja a hibát, hogy a dir /b /s beilleszti a teljes útvonalat is a visszaadott értékbe. Az fnr.exe pedig (a paraméterek alapján nekem legalábbis úgy tűnik) külön várja a könyvtárat?
    Mutasd a teljes hozzászólást!
  • A te for-os megoldásodat is próbáltam átírni:
    @echo off
    setlocal enabledelayedexpansion
    set cnt=1
    for /r %%B in (*.dat) do (
    "Y:\fnr\fnr.exe" --cl --dir "%CD%" --fileMask "%%B" --includeSubDirectories --find "PART," --replace "PART,!cnt!"
    set /a cnt=cnt+1
    pause
    )


    Ez lett belülle:

    Nem kezelt kivétel: System.ArgumentException: Az elérési út második része nem tartalmazhat meghajtó-betűjelet vagy UNC-nevet.
    Paraméter neve: path2
    a következő helyen: System.IO.Path.InternalCombine(String path1, String path2)
    a következő helyen: System.IO.FileSystemEnumerableIterator`1.GetFullSearchString(String fullPath, String searchPattern)
    a következő helyen: System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)
    a következő helyen: System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
    a következő helyen: FindAndReplace.Utils.GetFilesInDirectory(String dir, String fileMask, Boolean includeSubDirectories, String excludeMask, String excludeDir)
    a következő helyen: FindAndReplace.Replacer.Replace()
    a következő helyen: FindAndReplace.App.CommandLineRunner.Run(String[] args)
    a következő helyen: FindAndReplace.App.Program.Main(String[] args)
    Mutasd a teljes hozzászólást!
  • A dir /b /s ilyen sorokat ad vissza:

    C:\Proba4\valami\Doc

    Szerintem a c:\-től akad ki az fnr.exe.
    Mutasd a teljes hozzászólást!
  • Szia!
    Egyébbként a tömbös is ugyan ezt panaszkodja:
    @echo off
    SetLocal EnableDelayedExpansion
    SET /a num = 0
    FOR /F "tokens=*" %%a IN ('dir /s /b *.dat') DO (
    SET /a num = num + 1
    SET var!num!=%%a
    rem CALL ECHO !num! %%var!num!%%
    CALL "Y:\fnr\fnr.exe" --cl --dir "%CD%" --fileMask "%%var!num!%%" --includeSubDirectories --find "PART," --replace "PART,!num!"
    pause
    )
    EndLocal DisableDelayedExpansion
    pause
    exit /b

    Íme:

    Nem kezelt kivétel: System.ArgumentException: Az elérési út második része nem tartalmazhat meghajtó-betűjelet vagy UNC-nevet.
    Paraméter neve: path2
    a következő helyen: System.IO.Path.InternalCombine(String path1, String path2)
    a következő helyen: System.IO.FileSystemEnumerableIterator`1.GetFullSearchString(String fullPath, String searchPattern)
    a következő helyen: System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost)
    a következő helyen: System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
    a következő helyen: FindAndReplace.Utils.GetFilesInDirectory(String dir, String fileMask, Boolean includeSubDirectories, String excludeMask, String excludeDir)
    a következő helyen: FindAndReplace.Replacer.Replace()
    a következő helyen: FindAndReplace.App.CommandLineRunner.Run(String[] args)
    a következő helyen: FindAndReplace.App.Program.Main(String[] args)
    Mutasd a teljes hozzászólást!
  • Ez jó játék és biztosan hasznos is. A TC-ben a csoportos átnevezéssel ez a munka pár perc alatt megvan és a felszabaduló idődet fordíthatnád más hasznosabb dolgokra. Persze ha ez csak olyan tanulás céljából van, akkor nem szóltam.
    Mutasd a teljes hozzászólást!
  • Szia!
    Köszi, gyorsan ránéztem a dologra, de sajna a csoportos átnevezés a fájlok neveit változtatja, nekem meg az kellene, hogy egy a fileokban lévő karakter végére keröljön be a sorszáma a file-nak.
    Mutasd a teljes hozzászólást!
  • Ja értem, bocs.
    Mutasd a teljes hozzászólást!
  • Szia!
    Most eddig jutottam, ami nekem már végülis elég, de van egy kis szépséghibája.
    Mostmár szépen végigmegy a mappákon abban a fájlokon, csakhogy az öres soroknak és mappáknak is szémol 1-et.
    Most így dolgozik pl:
    mappa001 1
    -file001      2
    -file002      3
    -file003      4
    mappa002 5
    -file001      6
    -file002      7
    -file003      8
    amit beír a fájlokba az meg ugye akkor mappa001/file00x 2,3,4 és mappa002/file00x 6,7,8
    nem folytatja... de vágölis nekem már így is jó. :)

    @echo off
    SetLocal EnableDelayedExpansion
    SET /a num = 0
    FOR /F "tokens=*" %%a IN ('dir /B /A:D /S') DO (
    SET var!num!=%%a
    for /r %%B in (*.dat) do (
    IF "%%~xB"==".dat" (
    SET /a num = num + 1
    CALL "Y:\fnr\fnr.exe" --cl --dir "%%~xa%%~na" --fileMask "%%~nxB" --find "PART," --replace "PART,!num!"
    )))
    EndLocal DisableDelayedExpansion
    exit /b
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd