Automatiser création de dossiers et déplacement de fichiers
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
-
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
-
Bonsoir barnabe,
Merci pour la réponse, je vois le principe et vais tester cela.Merci encore !
-
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