Batch Créer des dossiers en fonction des noms de fichiers, à l'exclusion des parenthèses et des crochets

0

J'ai des milliers de fichiers avec la structure suivante:

Sample1 (43643) [3235]
Sample1 (32352) [6432]
Sample1 (35346) [4364]

J'essaie de créer par lots des dossiers en fonction du nom de fichier, à l'exception des crochets et des parenthèses, et de déplacer tous les fichiers portant le même nom dans ce dossier, comme suit:

Sample1\Sample1 (43643) [3235]
Sample1\Sample1 (32352) [6432]
Sample1\Sample1 (35346) [4364]

Des idees pour faire cela? Toute aide serait appréciée.

Mise à jour:

@beatcracker J'ai pu le faire fonctionner avec les exemples de noms de fichiers, mais voici les noms de fichiers que j'utilise (ce qui n'a pas fonctionné):

1st Division Manager (1992)(Codemasters)[cr NMS].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a10].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a11].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a12].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a2].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a3].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a4].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a5].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a6].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a7].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a8].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a9].adf
1st Division Manager (1992)(Codemasters)[cr NMS][a].adf
1st Division Manager (1992)(Codemasters)[cr NMS][h KTS].adf
3D Construction Kit II r2.01 (1992)(Domark)(Disk 1 of 2)[h Ministry][construction kit].adf
3D Construction Kit II r2.01 (1992)(Domark)(Disk 2 of 2)[construction kit].adf
3D Construction Kit II r2.03 (1992)(Domark)(FR)(Disk 1 of 2)[construction kit].adf
3D Construction Kit II r2.03 (1992)(Domark)(FR)(Disk 2 of 2)[construction kit].adf
Jonathan
la source
Je voudrais ajouter que j'utilise Windows 10.
Jonathan

Réponses:

0

Voici la version de PowerShell. Fonctionne pour le dossier unique, utilise regex pour faire correspondre les noms de fichiers. Il suffit de modifier $OrigFolder/ en $NewFolderconséquence:

# Folder where files are stored
$OrigFolder = 'C:\MyFolder'

# Folder where sorted files will be stored.
# It will be created if not exists.
$NewFolder = 'C:\MyFolder_Sorted'

# Folder, where files with empty part of the name will be stored
# Example: file "(1992)(Domark)(FR)(Disk 2 of 2)[construction kit].adf"
# will be moved to ".\Sorted\Unknown" folder
$UnknownFolder = 'Unknown'

# Regex to match filenames
$Regex = '^\s*(.*?)\s*\('

# Loop through files in directory, skip folders
Get-ChildItem -LiteralPath $OrigFolder | Where-Object {!$_.PsIsContainer} |
    ForEach-Object {
        if($_.BaseName -match $Regex){

            # If first part of the file name is empty,
            # move it to the 'Unknown' folder
            if(!$Matches[1]){
                $ChildPath = $UnknownFolder
            } else {
                $ChildPath =  $Matches[1]
            }

            # Generate new folder name
            $FolderName = Join-Path -Path $NewFolder -ChildPath $ChildPath

            # Create folder if not exists
            if(!(Test-Path -LiteralPath $FolderName -PathType Container)){
                $null = New-Item -Path $FolderName -ItemType Directory
            }

            # Basic logging
            Write-Host "$($_.FullName) -> $FolderName"

            # Move file
            Move-Item -LiteralPath $_.FullName -Destination $FolderName
        }
}

Enregistrez-le sous MoveFiles.ps1et exécutez-le dans la console PowerShell de la manière suivante:.\MoveFiles.ps1

beatcracker
la source
Bonjour, merci pour la réponse rapide. J'ai suivi attentivement les instructions, en modifiant les chemins des dossiers sur les lignes 1 et 2, puis en exécutant le script sous le nom. \ MoveFiles.ps1 dans PowerShell, mais rien ne s'est passé ...
Jonathan
@ Jonathan Peut-être que l'expression rationnelle est trop stricte (le script fonctionne pour moi avec votre exemple de noms de fichiers). Il ne correspond qu'aux noms de fichiers comme dans votre exemple. Pourriez-vous poster le nom de fichier actuel?
beatcracker
J'ai pu le faire fonctionner avec les exemples de noms de fichiers, mais voici les noms de fichiers avec lesquels je travaille (voir ci-dessus)
Jonathan
@ Jonathan Donc, fondamentalement, vous voulez que le nom du dossier soit quelconque avant le premier (? Exemple: 1st Division Manager, 3D Construction Kit II r2.03, 3D Construction Kit II r2.01? Puis voir ma réponse mise à jour.
beatcracker