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
- Automatiser création de dossiers et déplacement de fichiers
- Creation de compte google - Guide
- Creation de site web - Guide
- Création de compte gmail - Guide
- Explorateur de fichiers - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
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
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
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?
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.