Puncte:0

Căutăm o modalitate de a înlocui fiecare instanță a unui fișier de dimensiune diferită de zero într-un arbore de directoare folosind un fișier batch

drapel us

Încerc să găsesc o modalitate de a avea un script batch să suprascrie fiecare instanță a unui fișier diferit de zero octeți din interiorul unui anumit director și al subfolderelor acestuia. Bănuiesc că, deoarece caut un fișier diferit de zero, probabil că l-aș putea bucla cu un escape dacă nu găsește niciun fișier de dimensiune diferită de zero?

Exemplu, suprascrieți fiecare instanță de example.txt unde este o dimensiune a fișierului diferită de zero:

D:\
\---SubFolder1
    | exemplu.txt <10 octeți>
    |
    \---Subdosar2
        | exemplu.txt <0 octeți>
        |
        \---Subsubdosar1
                exemplu.txt <20 octeți>

În exemplu, D:\Subfolder1\example.txt și D:\Subfolder2\Subsubfolder1\example.txt ar fi suprascrise, dar D:\Subfolder2\example.txt nu ar fi schimbat.

Mulțumim lui @NiKiZe pentru tot ajutorul tău!

Cod de lucru:

@ECHO OPRIT

SET DPATH=%~dp0

PENTRU /R „%DPATH%” %%F IN (*** VEZI MAI JOS) DO IF %%~zF GTR NEQ 0 CALL:NonEmptyFile „%%~F”
GOTO :EOF

:NonEmptyFile
ECHO Am primit un fișier care nu este gol: %1
Apel: EOF

*** Înlocuiți cu numele fișierului pe care doriți să-l înlocuiți, asigurați-vă că utilizați undeva un metacar cu un singur caracter (l-am folosit în extensie - de exemplu, dacă caut exemplu.txt, am înlocuit * cu example.t ?t)

drapel in
Trebuie să fie `cmd`? Va trebui să faceți bucle și apeluri recursive, dar `for` intern ar trebui să poată face acest lucru.
drapel in
Am greșit la apelurile recursive lucrurile, cel puțin din ceea ce am înțeles din întrebare, dar s-ar putea să greșesc? Poate ar trebui să verifice doar „example.txt”?
wb6vpm avatar
drapel us
Din păcate, da, caut să adaug acest lucru la un fișier batch existent, unde trebuie să înlocuiesc fișierele existente care au fost actualizate (dimensiune diferită de zero) cu fișierul original de dimensiunea de 0 octeți, iar fișierul există în mai multe subfoldere care se poate schimba, așa că nu pot doar codifica fiecare (sub)dosar posibil pentru a șterge și a restabili.
Puncte:1
drapel in

Lot minim care parcurge o anumită cale și toate subfișierele și subcăile, apelând la NonEmptyFile etichetă pentru fiecare fișier care nu este gol.

@ECHO OPRIT

SET DPATH=%~dp0

FOR /R "%DPATH%" %%F IN (*) DO IF %%~zF GTR 0 CALL :NonEmptyFile "%%~F"
GOTO :EOF

:NonEmptyFile
  ECHO Am primit un fișier care nu este gol: %1
Apel: EOF

Prin utilizarea %~1 in functie va fi extinsa si puteti folosi ceva de genul COPIEAZĂ /Y „somefile.txt” „%~1” Modul în care doriți să suprascrieți fișierele nu a fost specificat.

O altă opțiune pentru a crea „fișiere goale” este ECOU.> „%~1”

Explicaţie:

  • PENTRU /R „%DPATH%” %%F IN (*) DO plimbă fiecare dosar
  • DACA %%~zF GTR 0 dacă dimensiunea fișierului este mai mare decât...
  • CALL:NonEmptyFile „%%~F” Suna :NonEmptyFile etichetă cu numele fișierului escape

Pentru a testa acest lucru la prompt, utilizați FOR /R "D:\SubFolder1\" %F IN (*) DO IF %~zF GTR 0 ECHO NonEmptyFile "%~F"

Mai multe informații despre cum pentru lucrările se dă prin rulare pentru /? în cmd

wb6vpm avatar
drapel us
Mulțumesc foarte mult! A trebuit să fac câteva ajustări pentru a-l face să coopereze, dar asta mi-a oferit un punct de plecare foarte bun!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.