J'ai un dossier qui contient les fichiers suivants:
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.
4 Réponses :
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"
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
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 batch-file
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 batch-file :
@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 cmd :
@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 powershell :
@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"
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 )
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…
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
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 a >.
Que se passe-t-il lorsque vous réintroduisez la commande
dir
manquante? et supprimer leskip = 1
apparemment inutile? et évidemment changerecho
endel
? et utilisez de préférence==
au lieu deneq
? et plus en toute sécurité, utilisez l'option/ I
avec votre commandeif
? puis utilisez%% i
au lieu de% i
car vous utilisez un fichier de commandes?