0
votes

Comment obtenir le nom du dossier avec le numéro le plus élevé dans le nom du dossier?

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?


3 commentaires

Quel est le nom du dossier après dossier abc_03_00_016_9 ? Est-ce abc_03_00_016_10 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 ...


5 Réponses :


0
votes

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


0 commentaires

0
votes

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.


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires