Pour tester avec echo en une seule ligne (cela devrait fonctionner avec un sous-dossier si vous ajoutez /s
dans la commande dir
)
for /f "delims=" %a in ('dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"') do @echo %~fa
Commande de copie en une ligne
for /f "delims=" %a in (
'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do @copy "%~fa" "destination-dir"
Fichier batch
for /f "delims=" %%a in (
'dir /b /a-d "?????.txt"^|findstr /R "\\.....\.txt$"'
) do (
copy "%%~fa" "destination-dir"
)
Modifier:
/a-d
scanne des fichiers
/ad
scanne des dossiers
Sans /a[d|-d]
cela scannera les deux voir dir /?
pour plus d'informations
Si j'ai ajouté "?????.txt"
dans la commande "dir
" c'est pour réduire la portée du scan et donc réduire le temps de scan. Vous pouvez toujours étendre la portée du scan dans la commande "dir
" mais le plus important est le motif dans la commande "findstr
"
J'ai changé "^.....\.txt"
en "\\.....\.txt$"
pour être capable de scanner le nom du dossier.
. Jocker : n'importe quel caractère
ˆ Position de la ligne : début de la ligne
$ Position de la ligne : fin de la ligne
\. Échappement : utilisation littérale du méta-caractère .
Voir findstr /?
pour plus d'informations
Pourquoi cela ne fonctionne-t-il pas dans certains cas ? Parce qu'il n'y a pas de solution universelle, vous devez adapter la commande à votre cas. Si vous utilisez /b sans /s la commande dir
produira une sortie sans barre oblique finale \
donc le motif findstr
avec \\
échouera.
Ceci va échouer : dir /b "*.txt"|findstr /R "\\........$"
Alors que ceci va réussir : dir /b "*.txt"|findstr /R "^........$"
De même qu'avec une commande dir
qui produit une sortie lorsque le mot du motif de recherche est à la fin de la ligne séparé par une barre oblique finale échouera également.
Comme ceci va échouer : dir /b /s "*.txt"|findstr /R "^........$"
mais ceci va réussir : dir /b /s "*.txt"|findstr /R "\\........$"