J'ai plusieurs dossiers avec ces noms:
ABC_03_00_016_0 ABC_03_00_016_1 ABC_03_00_016_2 ABC_03_00_016_3 ABC_03_00_016_4 ABC_03_00_016_5
Ce que je veux faire est de conserver le dossier avec le plus grand nombre à la fin du nom de dossier, c'est-à-dire ABC_03_00_016_5 code > dans le cas ci-dessus en utilisant PowerShell ou des commandes batch.
Comment obtenir le dossier avec le plus grand nombre?
5 Réponses :
Peut-être que cela pourrait être fait de manière plus élégante, mais cela fonctionne probablement comme vous le souhaitez. Je supprime les derniers chiffres, les convertit et les compare pour ensuite déterminer le plus élevé. Comme vous pouvez le voir, l'ordre n'a pas d'importance:
$items = "ABC_03_00_016_0", "ABC_03_00_016_100", "ABC_03_00_016_99" [int]$highestNumberTillNow = 0 $highestitem = "" foreach ($item in $items){ [int]$number = $item.substring($item.LastIndexOf("_")+1,$item.length-$item.LastIndexOf("_")-1) if ($number -gt $highestNumberTillNow){ $highestNumberTillNow = $number $highestitem = $item } } write-host $highestitem
La première méthode ne peut être utilisée que si tous les noms de dossier ont la même longueur, c'est-à-dire que des zéros non significatifs sont utilisés pour s'assurer que tous les numéros de tous les noms de dossier ont le même nombre de chiffres.
@echo off set "LastFolder=" setlocal EnableExtensions EnableDelayedExpansion set "FolderNumber=-1" for /F "eol=| delims=" %%I in ('dir "%~dp0ABC_03_00_016_*" /AD /B 2^>nul') do ( for /F "eol=| tokens=5 delims=_" %%J in ("%%I") do ( if %%J GTR !FolderNumber! ( set "LastFolder=%%I" set "FolderNumber=%%J" ) ) ) endlocal & set "LastFolder=%LastFolder%" if not defined LastFolder ( echo Found no folder matching pattern ABC_03_00_016_* in "%~dp0". ) else ( echo Last folder according to last number in name is: %LastFolder% )
La tâche pour obtenir le nom du dossier avec le plus grand dernier numéro est plus difficile car le nombre de chiffres diffère du dernier numéro.
@echo off set "LastFolder=" for /F "eol=| delims=" %%I in ('dir "%~dp0ABC_03_00_016_*" /AD /B /O-N 2^>nul') do set "LastFolder=%%I" & goto HaveFolder echo Found no folder matching pattern ABC_03_00_016_* in "%~dp0". goto :EOF :HaveFolder echo Last folder according to sorted folder names is: %LastFolder%
Remarque: Le dernier numéro dans le nom du dossier ne doit jamais avoir de zéros non significatifs lors de l'utilisation du deuxième code ci-dessus. Un nombre avec un ou plusieurs 0
non significatifs est interprété comme un nombre octal qui signifie 08
, 09
, 18
, 19 , etc. sont des nombres octaux invalides et sont interprétés pour cette raison avec la valeur 0
par la commande IF lors de la comparaison d'entiers. Un code supplémentaire serait nécessaire au-dessus de la condition IF pour d'abord supprimer tous les 0
de tête de la chaîne de nombres avant de faire la comparaison d'entiers.
commandes et leur fonctionnement, ouvrez une fenêtre invite de commande , exécutez les commandes suivantes et lisez entièrement toutes les pages d'aide affichées pour chaque commande très attentivement.
call /?
... explique % ~ dp0
(lecteur et chemin du fichier de commandes se terminant par une barre oblique inverse). dir /?
echo /?
endlocal /?
pour /?
si /?
set /?
setlocal /?
Lisez l'article de Microsoft sur Utilisation des opérateurs de redirection de commande pour une explication de 2> nul
. L'opérateur de redirection >
doit être échappé avec le caractère caret ^
sur la ligne de commande FOR pour être interprété comme un caractère littéral lorsque l'interpréteur de commandes Windows traite cette ligne de commande avant d'exécuter la commande FOR qui exécute la ligne de commande dir
intégrée dans un processus de commande séparé démarré en arrière-plan.
Vous pouvez utiliser ceci:
@echo off setlocal enabledelayedexpansion pushd "%~dp0" for /f "tokens=4 delims=_" %%a in ('dir ABC_03_016_* /ad /b') do ( for /f "tokens=* delims= " %%b in ('dir ABC_03_016_* /ad /b') do ( set dir[%%a]=%%b ) ) set dc=0 :loop set /a dc=dc+1 if defined dir[%dc%] goto loop goto break :break set /a dc=dc-1 echo The folder is !dir[%dc%]! pause >nul
En supposant que vous pourriez avoir plus de dossiers avec un nom similaire dans le chemin racine comme
( Match the regular expression below and capture its match into backreference number 1 . Match any single character that is not a line break character + Between one and unlimited times, as many times as possible, giving back as needed (greedy) ) _ Match the character â_â literally ( Match the regular expression below and capture its match into backreference number 2 \d Match a single digit 0..9 + Between one and unlimited times, as many times as possible, giving back as needed (greedy) ) $ Assert position at the end of the string (or before the line break at the end of the string, if any)
En utilisant PowerShell, vous pouvez utiliser quelque chose comme ci-dessous. Cela renverra le ou les objets de dossier avec le numéro le plus élevé à la fin du nom:
D:\test\ABC_03_00_016_5 D:\test\DEF_03_00_016_10
Sortie:
$lastFolder = Get-ChildItem -Path 'D:\test' -Directory | Where-Object { $_.Name -match '(.+)_(\d+)$' } | Group-Object -Property @{Expression={ $matches[1] }} | ForEach-Object { $_.Group | Sort-Object -Property @{Expression={ [int]$matches[2] }} | Select-Object -Last 1 } # for demo, just output the FullName property of the folders found $lastFolder.FullName
Détails Regex:
ABC_03_00_016_0 ABC_03_00_016_1 ABC_03_00_016_2 ABC_03_00_016_3 ABC_03_00_016_4 ABC_03_00_016_5 DEF_03_00_016_0 DEF_03_00_016_1 DEF_03_00_016_10
Si vous souhaitez supprimer tous les répertoires, à l'exception de celui qui se termine avec le plus grand nombre, alors je suggérais PowerShell aussi:
Get-ChildItem -Path 'C:\Users\Naqqash\Desktop' -Filter '*_*_*_*_*' -Directory | Where-Object { $_.Name -Match '(.+)_(\d+)$' } | Sort-Object -Property { [Int]$($_.Name).Split('_')[-1] } | Select-Object -SkipLast 1 | Remove-Item
Quel est le nom du dossier après dossier
abc_03_00_016_9 code>? Est-ce
abc_03_00_016_10 code> ou avez tous deux dossiers à deux chiffres à la fin si l'un des dossiers a le dernier numéro à plus d'un chiffre?
oui c'est "ABC_03_00_016_10". et après 99, ce sera "ABC_03_00_016_100" i; e à 3 chiffres.
Qu'avez-vous essayé par vous-même, où êtes-vous coincé? Avez-vous essayé de rechercher ce site? Je suis sûr qu'il y avait déjà des questions similaires, comme celle-ci , par exemple ...