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

A voir également:

3 réponses

barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 

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
brucine Messages postés 21725 Date d'inscription   Statut Membre Dernière intervention   3 432
 

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
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925 > brucine Messages postés 21725 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
RNGO79
 

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

Merci encore !

0
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
RNGO79
 

Merci !

0