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

Fermé
RNGO79 - 20 févr. 2023 à 15:27
 RNGO79 - 24 févr. 2023 à 11:30

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
20 févr. 2023 à 18:48

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 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024 1 813
20 févr. 2023 à 21:12

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 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908 > brucine Messages postés 14316 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 avril 2024
21 févr. 2023 à 08:39

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

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

Merci encore !

0

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

Merci !

0