0
votes

Supprimer les fichiers avec une extension spécifique à l'exception d'un fichier particulier

J'ai un dossier qui contient les fichiers suivants:

 entrez la description de l'image ici

Comment puis-je supprimer tous les fichiers avec l'extension .rst (File1.rst, File2.rst, File3.rst, File4.rst, File5.rst) sauf le fichier "index.rst" d'un fichier batch.

J'ai essayé, mais cela ne fonctionne pas:

for /f "skip=1 delims=" %%i in ('D:\hfTools\Projects\Validation-Source\Docs\source /b "*.rst"') do @(if "%i" neq "index.rst" echo %i)

Toute aide serait la bienvenue. Merci.


1 commentaires

Que se passe-t-il lorsque vous réintroduisez la commande dir manquante? et supprimer le skip = 1 apparemment inutile? et évidemment changer echo en del ? et utilisez de préférence == au lieu de neq ? et plus en toute sécurité, utilisez l'option / I avec votre commande if ? puis utilisez %% i au lieu de % i car vous utilisez un fichier de commandes?


4 Réponses :


0
votes

Non testé:

/M *.rst    # only consider *.rst
if ...      # @file is the filename as found by forfiles
            # != is this the correct way say "does not equal"?

Explication:

forfiles /M *.rst /C "cmd /c if @file!=index.rst del @file"


5 commentaires

désolé de demander, où dois-je spécifier le répertoire où se trouvent tous ces dossiers? Au lieu de / C?


Vous pouvez ajouter / P .


Le code supprime index.rst, pas les fichiers nécessaires (File1.rst, File2.rst) étrange


forfiles / P D: \ source / M * .rst / C "cmd / c sinon @file ==" index.rst "del @file"


! = n'est pas reconnu



1
votes

Voici un exemple de la façon d'exécuter la tâche à l'aide de la commande ForFiles , forfiles.exe:

@%__AppDir__%WindowsPowerShell\v1.0\powershell.exe -NoP "RI 'D:\hfTools\Projects\Validation-Source\Docs\source\*.rst' -E 'index.rst' -Fo"


Voici un exemple d’exécution de la tâche à l’aide de la commande Dir :

Remove-Item -Path "D:\hfTools\Projects\Validation-Source\Docs\source\*.rst" -Exclude "index.rst" -Force


Ma préférence serait cependant d'utiliser la commande Where , where.exe:

Exemple

For /F "EOL=?Delims=" %G In ('%__AppDir__%where.exe "D:\hfTools\Projects\Validation-Source\Docs\source":"*.rst"^|%__AppDir__%findstr.exe /EILV "\index.rst"')Do @Del /A/F "%G"

Vous pourriez même faire cela en une seule ligne

@For /F "EOL=?Delims=" %%G In ('%__AppDir__%where.exe "D:\hfTools\Projects\Validation-Source\Docs\source":"*.rst"^|%__AppDir__%findstr.exe /EILV "\index.rst"')Do @Del /A/F "%%G"

Ou directement à partir d'un :

@Echo Off
SetLocal EnableExtensions
For /F "EOL=? Delims=" %%G In ('%__AppDir__%where.exe ^
 "D:\hfTools\Projects\Validation-Source\Docs\source":"*.rst" ^
 ^| %__AppDir__%findstr.exe /E /I /L /V "\index.rst"'
) Do Del /A /F "%%G"


Et pour un bonus hors sujet, car pour une utilisation générale, cela semble plus facile; utilisez plutôt :

@Echo Off
SetLocal EnableExtensions
If Exist "D:\hfTools\Projects\Validation-Source\Docs\source\*.rst" (
    PushD "D:\hfTools\Projects\Validation-Source\Docs\source" && (
        For /F "EOL=? Delims=" %%G In ('Dir /B /A:-D "*.rst" ^
         ^| %__AppDir__%findstr.exe /E /I /L ".rst" ^
         ^| %__AppDir__%findstr.exe /I /L /V /X "index.rst"'
        ) Do Del /A /F "%%G"
        PopD
    )
)

Vous pouvez même l'exécuter en utilisant un fichier batch d'une ligne, si vous en aviez vraiment besoin:

@%__AppDir__%forfiles.exe /P "D:\hfTools\Projects\Validation-Source\Docs\source" /M "*.rst" /C "%__AppDir__%cmd.exe /D /C If @IsDir==FALSE If /I Not @FName==0x22index0x22 Del /A /F @File"


0 commentaires

0
votes

Vous êtes en fait assez proche, vous avez juste oublié de doubler quelques signes % et vous avez manqué la commande dir :

rem // Change to target directory, because `dir /B` only returns pure file names:
pushd "D:\hfTools\Projects\Validation-Source\Docs\source" && (
    rem // Capture the output of `dir /B` and loop through the lines/files:
    for /f "delims= eol=|" %%i in ('
        dir /B /A:-D-H-S "File*.rst"
    ') do @(
        rem // Actually delete the currently iterated file:
        ECHO del "%%i"
    )
    popd
)

Une fois que vous êtes satisfait du résultat, supprimez la commande ECHO en majuscules pour supprimer réellement les fichiers.

Notez que le modèle * .rst dans la ligne de commande dir / B est en fait vérifié par rapport aux deux noms de fichiers longs et courts (si ce dernier est activé), il correspond donc aux fichiers dont les extensions commencent par em> rst (le cas échéant).


Si les fichiers à supprimer correspondent toujours au modèle File * .rst , vous n'avez même pas besoin la condition if :

rem // Change to target directory, because `dir /B` only returns pure file names:
pushd "D:\hfTools\Projects\Validation-Source\Docs\source" && (
    rem // Capture the output of `dir /B` and loop through the lines/files:
    for /f "delims= eol=|" %%i in ('
        dir /B /A:-D-H-S "*.rst"
    ') do @(
        rem // Check file name against predefined exception:
        if /I not "%%i"=="index.rst" (
            rem // Actually delete the currently iterated file:
            ECHO del "%%i"
        )
    )
    popd
)


3 commentaires

Sachez que Dir avec * .rst , ne sélectionne pas les fichiers avec uniquement l'extension insensible à la casse .rst . Il sélectionne tous les fichiers avec une extension de fichier commençant par .rst . Pour cette raison, dans mon exemple Dir fourni, j'ai utilisé findstr.exe pour exclure spécifiquement cette possibilité. Il est peu probable que vous ayez d'autres fichiers avec des extensions commençant par, (il n'y en a pas dans votre capture d'écran) , mais ne correspondant pas à .rst , mais un script robuste, en particulier celui qui supprime les fichiers, ne doit pas faire d'hypothèses.


Une fois qu'un FindStr est introduit pendant la partie 'commande', il est plus efficace d'exclure le nom connu dans cette commande, (en utilisant un autre tube vers FindStr ) < / i>, que de le faire en utilisant une instruction If dans la partie 'do'. En fait, j'ai déjà été informé ici que le tube unique vers FindStr dans la partie 'command' est plus efficace que d'utiliser une instruction If dans le 'do' portion.


Vous avez raison, @Compo, merci! J'ai modifié ma réponse pour mentionner les noms 8.3…



0
votes

Cela se fait facilement en utilisant PowerShell. Si vous utilisez une version prise en charge de Windows, PowerShell sera disponible. Lorsque vous êtes sûr que les fichiers corrects seront supprimés, supprimez le -WhatIf de la commande.

powershell -NoLogo -NoProfile -Command ^
    "Remove-Item -Path './*' -Include '*.rst' -Exclude 'index.rst' -WhatIf"

Id vous devez le faire à partir d'un cmd.exe (. bat file) script:

Remove-Item -Path './*' -Include '*.rst' -Exclude 'index.rst' -WhatIf


1 commentaires

Outre l'utilisation spécifique du paramètre -Include allumé, qui n'est pas techniquement nécessaire ici , ma réponse a déjà fourni un powershell , avec comment l'exécuter à partir d'un fichier batch .