Automatiser création de dossiers et déplacement de fichiers

RNGO79 -  
 RNGO79 -

Bonjour à tous,

je suis bloqué dans un script qui devrait faire les tâches suivantes :

Dans un dossier SOURCE, il crée dans chaque sous-sous-dossier un dossier portant le nom du sous-dossier, y déplacer les fichiers du sous-sous-dossier, puis déplacer le nouvel ensemble (sous-sous-dossier\sous-dossier) dans dossier de DESTINATION, et ainsi de suite.

En gros, le rôle des sous-dossiers et sous-sous-dossiers sont inversés à l'arrivé de DESTINATION.

sous forme de schéma :

SOURCE

    --- A1

          ---- A11

          ---- A12

    --- A2

          ---- A21

          ---- A22

DESTINATION

     --- A11

          ---- A1

     --- A12

          ---- A1

     --- A21

          ---- A2

     --- A22

          ---- A2

J'ai essayé de faire un script BATCH :

@echo off

set "parent_folder=C:\chemin\vers\le\dossier\parent"

set "destination_folder=C:\chemin\vers\le\dossier\destination"

for /d %%D in ("%parent_folder%\*") do (

    for /d %%S in ("%%D\*") do (

           set "new_folder=%%~nS"

           md "%%S\!new_folder!"

           move "%%S\*" "%%S\!new_folder!\"

           move "%%S\!new_folder!" "%destination_folder%\"

    )

)

echo Le traitement est terminé.

pause

Mais ne fonctionne pas comme voulais...

J'ai aussi essayé en powershell :

$parentFolder = "M:\source"

$destinationFolder = "M:\destination"

Get-ChildItem -Path $parentFolder -Recurse -Directory | ForEach-Object {

    $subSubFolder = $_.FullName

    $newFolder = New-Item -ItemType Directory -Path $subSubFolder -Name $_.Name

    Get-ChildItem -Path $subSubFolder -File | Move-Item -Destination $newFolder.FullName

    Move-Item -Path $subSubFolder -Destination $destinationFolder

}

ne fonctionne pas non plus...

Windows / Chrome 109.0.0.0

3 réponses

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     

    Bonjour,

    Voilà un exemple en batch :

    @echo off
    setlocal enableextensions
    
    set "source=C:\chemin\vers\le\dossier\parent"
    set "destination=C:\chemin\vers\le\dossier\destination"
    
    cd /d %source% || exit /b 1
    
    for /f "delims=" %%A in ('dir /b /ad') do (
    	for /f "delims=" %%E in ('dir /b /ad "%%~A"') do (
    		if not exist "%destination%\%%~E\%%~A" (mkdir "%destination%\%%~E\%%~A")
    		robocopy "%source%\%%~A\%%~E" "%destination%\%%~E\%%~A" /MOVE
    	)
    )
    
    pause
    exit


    0
    1. brucine Messages postés 24916 Date d'inscription   Statut Membre Dernière intervention   4 180
       

      Bonjour barnabe,

      Ne convient-il pas que la syntaxe ROBOCOPY ne se contente pas de déplacer les dossiers AxAxy sans à la fin de l'opération supprimer les dossiers source de premier rang Ax restés vides?

      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > brucine Messages postés 24916 Date d'inscription   Statut Membre Dernière intervention  
         

        Bonjour brucine,

        C'est une bonne idée mais ce n'est pas demandé explicitement, si l'utilisateur le souhaite il lui suffit de modifier légèrement le script.

        0
  2. RNGO79
     

    Bonsoir barnabe,
    Merci pour la réponse, je vois le principe et vais tester cela.

    Merci encore !

    0
  3. Zang
     

    RNGO79,

    En PowerShell tu peux faire ceci sinon :

    Set-Location $Env:USERPROFILE #Force being out of the folder handled
    $Source = 'C:\Users\RNGO\Desktop\Source'
    $Destination = 'C:\Users\RNGO\Desktop\Destination'
    
    #Get the child
    $SourceFolders = Get-ChildItem -Path $Source -Directory -Recurse
    
    #Keep the root
    $SourceFoldersRoot = Get-ChildItem -Path $Source -Directory
    
    #Create the structure
    foreach($SourceFolder in $SourceFolders)
    {
      New-Item -Path $Destination -ItemType Directory -Name $SourceFolder.BaseName
      New-Item -Path "$Destination\$($SourceFolder.BaseName)" -ItemType Directory -Name $SourceFolder.Parent.BaseName
      
      #Copy not Move to avoid exception during the procedure
      Copy-Item -Path "$SourceFolder\*" -Destination "$Destination\$($SourceFolder.BaseName)\$($SourceFolder.Parent.BaseName)" -Force
    }
    
    #Remove the destination folders corresponding to the source structure
    foreach($SourceFolderRoot in $SourceFoldersRoot){
      Remove-Item -Path "$Destination\$($SourceFolderRoot.BaseName)" -Recurse -Force -Confirm:$false
    }
    
    #Remove the source
    Remove-Item -Path $Source -Recurse -Force -Confirm:$false
    0
    1. RNGO79
       

      Merci !

      0