Mon outil d'importation de photos (Picasa) effectue un excellent travail d'importation de photos et de vidéos à partir de mon téléphone et de mon appareil photo. Ce que j'aime, c'est qu'il crée un sous-dossier sous le répertoire Pictures en fonction de la date de prise de photo de chaque photo/vidéo. Donc vous vous retrouvez avec cette structure:Déplacez les fichiers vidéo du répertoire Images vers le répertoire Vidéo
C:\Pictures\2017-02-01\DSC_0001.jpg
C:\Pictures\2017-02-01\DSC_0002.jpg
C:\Pictures\2017-02-01\DSC_0003.mp4 <--- problem
Le seul problème est qu'il place des vidéos dans cette même structure sous Photos. En tant que tel, je voudrais redresser un script batch pour trouver et déplacer tous les fichiers vidéo (.mp4, .avi, .mov) du répertoire C: \ Pictures vers le répertoire C: \ Videos, mais aussi avec le sous-dossier de date .... à savoir
Move C:\Pictures\2017-02-01\DSC_0003.mp4 to C:\Videos\2017-02-01\DSC_0003.mp4
Notez que le sous-dossier de date peut ou peut ne pas exister sous C: \ Vidéos. Comme il s'agit de gros fichiers vidéo, et qu'ils sont nombreux, je préférerais un processus qui effectue un déplacement et non une copie puis une suppression, pour des raisons de rapidité et d'utilisation de l'espace disque. presque hors de l'espace (après réorganisation de ces fichiers, je vais archiver sur un NAS).
Préférez également utiliser RoboCopy, xcopy ou xxcopy comme je les ai et utilisez-les aujourd'hui sur ma machine. Si massivement plus facile à l'aide de scripts PowerShell, je peux apprendre que si c'est facile à faire.
Solution finale je la réponse de Mofi, mais amélioré juste un peu d'ajouter une fonction pour calculer la longueur de chaîne de répertoire
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Define folder with the pictures which is never deleted.
set "PicturesFolder=D:\Users\Chad\PicturesTest"
rem get string length of source directory to later use in a substring type function
call :strlen PicturesFolderDirectoryLength PicturesFolder
echo PicturesFolderDirectoryLength = %PicturesFolderDirectoryLength%
rem Change the current directory to directory with the pictures.
cd /D "%PicturesFolder%"
rem Search recursive in this directory for video files with
rem file extension AVI, MOV, MP4 or MPG and move those files.
for /F "delims=" %%I in ('dir /A-D /B /S *.avi *.mov *.mp4 *.mpg 2^>nul') do call :MoveVideo "%%I"
rem Discard all environment variables defined in this batch code
rem and restore initial current directory before exiting batch file.
endlocal
goto :EOF
rem MoveVideo is a subroutine called with name of current
rem video file name with full path by the FOR loop above.
rem It first defines target path for video file depending on source path
rem by removing the backslash at end and concatenating C:\Videos with the
rem source path omitting the first 11 characters which is C:\Pictures.
rem Then the target directory structure is created with redirecting the
rem error message output by command MD to handle STDERR in case of the
rem target directory already exists to device NUL to suppress it.
rem Next the video file is moved from source to target folder with silently
rem overwriting an already existing file with same name in target folder
rem because of using option /Y. Remove this option if a video file should
rem be kept in pictures folder and an error message should be displayed in
rem case of a video file with same name already existing in target folder.
rem Last the source folder is removed if it is completely empty which means
rem it does not contain any file or subfolder. All parent folders up to the
rem pictures folder are also removed if each parent folder is also empty
rem after deletion of an empty folder.
rem The subroutine is exited with goto :EOF and execution of batch file
rem continues in main FOR loop above with next found video file.
:MoveVideo
set "SourcePath=%~dp1"
set "SourcePath=%SourcePath:~0,-1%"
ECHO SourcePath=%SourcePath%
CALL SET "SourceSubFolder=%%SourcePath:~%PicturesFolderDirectoryLength%%%"
ECHO SourceSubFolder=%SourceSubFolder%
set "TargetPath=D:\Users\Chad\VideosTest%SourceSubFolder%"
echo TargetPath=%TargetPath%
md "%TargetPath%" 2>nul
move /Y "%~1" "%TargetPath%\%~nx1" >nul
:DeleteSourceFolder
rd "%SourcePath%" 2>nul
if errorlevel 1 goto :EOF
for /F "delims=" %%D in ("%SourcePath%") do set "SourcePath=%%~dpD"
set "SourcePath=%SourcePath:~0,-1%"
if /I not "%SourcePath%" == "%PicturesFolder%" goto DeleteSourceFolder
goto :EOF
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
Je suis gêné de demander cela à un utilisateur qui a près de 2000 rep mais ... pourriez-vous nous montrer ce que vous avez essayé jusqu'à présent? – SomethingDark