Move file to trimmed filename location with full name in Batch

亡梦爱人 提交于 2020-07-10 07:35:16

问题


I'm trying to move several similar files into folders based on the filename.
The code below works fine but does not work if the base name is more than 5 characters, then it says the directory already exists, and moves the files to the shorter named folder.

The idea is to make folders based on a text file, and move it together with pictures wich start with the same name (up to an "_" to that same folder, while the filenames remain intact. The picture names are longer though with varying lengths.

eg:

SB12.txt
SB123.txt
SB1234.txt
SB12345.txt
SB123_V_05062020.jpg
SB123_VT_05062020.jpg
SB12345_V_05062020.jpg
SB12345_VT_05062020.jpg

I tried adding delims=_ to the loop parameters but does not work like this :
for /f "tokens=* delims=_ " %%f in ('dir /b /on "%dir%\*%ext%"') do (

I already "solved" the longer name problem by changing the wildcard to >.* like the line below, but then the pictures don't get moved:
move "%dir%\!thefile!>.*" "%dir%\%yyyymmdd%\!thefile!\"

full code:

@echo off  
setlocal  

REM store current directory. Using separate variable makes it easier to change behaviour too.  
set dir=%cd%  

REM make date fitting for folder needs  
for /f "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k\%%j\%%i  

REM call subroutine for each supported extension.  
call :dotxt .txt  
REM call :dojpg .jpg  

REM Main program done.  
echo Press a key to close.  
pause  
exit /b  

:dotxt  
set ext=%1  
REM loop through all files with the given extension.  
for /f "tokens=*" %%f in ('dir /b /on "%dir%\*%ext%"') do (  
  REM trim the extension and use the base name as directory name.  
  setlocal EnableDelayedExpansion  
  set thefile=%%~nf  
  echo !thefile!  
  md "%dir%\%yyyymmdd%\!thefile!"  
  REM move all files that start with the same base name.  
  move "%dir%\!thefile!*.*" "%dir%\%yyyymmdd%\!thefile!\"  
)  

%SystemRoot%\explorer.exe %dir%\%yyyymmdd%  
REM exit subroutine  
exit /b  

I think I might need an additional loop or another "set" option but can't get it figured out on my own

Any help would be much appreciated!


回答1:


A somewhat easier way, assuming you've already defined Dir and yyyymmdd

@Echo off
Set "Dir=Path of Root\"
Set "yyyymmdd=Define Date Substring"
::: { Set environment state for Macro Definitions
    Setlocal DisableDelayedExpansion

    (Set LF=^


    %= Above Empty lines Required =%)

    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::: { Macro for relocation of files to folders using Substring of Filename
::: - Usage:
::: %MOVEIF%{Search String*.Extension}{Destination Directory}
%= Capture Arguments =%
SET MOVEIF=For %%n in (1 2) Do If %%n==2 (%\n%
%= Split arguments using braces as delims =%
    For /F "Tokens=1,2 Delims={}" %%G in ("!ITEM!") Do (%\n%
%= Use Arg 1 as search pattern for files in current and sub directories  =%
        For /F "Delims=" %%F in ('dir "%%~G" /b /s') do (%\n%
%= Split the name of file from _ for use as folder name =%
            For /F "Tokens=1 Delims=_" %%N in ("%%~nF") Do (%\n%
%= Test / Create Subfolder in target Subdirectory using Arg 2 =%
                IF Not exist "%%~H\%%~N" MD "%%~H\%%~N"%\n%
%= Execute move =%
                Move "%%~F" "%%~H\%%~N"%\n%
            )%\n%
        )%\n%
    )%\n%
) Else Set ITEM=
::: }
::: - enable macro, execute with args.
    Setlocal EnableDelayedExpansion
    CD "%Dir%" && For %%x in (jpg txt) Do For %%p in (SB) Do (%MOVEIF%{%%~p*.%%~x}{%Dir%%yyyymmdd%}) 2> Nul
    Pause
Exit /B 0

Note: It isn't necessary to use a macro to achieve this, however it makes it very easy to use the code for other search strings or directories, as there is no need to edit the macro, you just call it with different parameters.




回答2:


This is not a particularly complex task – here is a possible script (see all the rem comments):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=%~dp0."  & rem // (path to directory containing target files)
set "_MASK=SB*.txt" & rem /* (file name pattern to find the master files,
                      rem     which sub-directory names are derived from) */
set "_SUFF=_*.jpg"  & rem /* (suffix pattern to be appended to the base
                      rem     name of a master file to find related slave
                      rem     files, which are to be moved in addition) */

rem // Change into the root directory:
pushd "%_ROOT%" && (
    rem // Loop through the found master files:
    for /F "delims= eol=|" %%F in ('dir /B /A:-D-H-S "%_MASK%"') do (
        rem // Create sub-directory with base name of current master file:
        md "%%~nF" 2> nul
        rem // Move the master file into the sub-directory:
        move "%%F" "%%~nF\" > nul
        rem // Move related slave files into the sub-directory:
        if exist "%%~nF%_SUFF%" move "%%~nF%_SUFF%" "%%~nF\" > nul
    )
    rem // Return from the root directory:
    popd
)

endlocal
exit /B



回答3:


With some help I was able to get my script working, it just doesnt like spaces bu that's fine for me:

@echo off
setlocal

REM store current directory. Using separate variable makes it 
REM easier to change behaviour too.
set dir=%cd%

REM make date fitting for folder needs
for /f "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k\%%j\%%i


REM call subroutine for each supported extension.
call :do .txt
call :do .jpg


REM Main program done.
echo Press a key to close.
pause
exit /b

:do
set ext=%1
REM loop through all files with the given extension.
for /f  %%f in ('dir /b /on "%dir%\*%ext%"') do (
    echo %%f
    for /f "tokens=1 delims=_." %%m in ("%%f") do (
        echo %%m
        REM Make the folder
        if not exist "%dir%\%yyyymmdd%\%%m" mkdir "%dir%\%yyyymmdd%\%%m"
        echo %dir%\%%m\%%f
        move ".\%%f" "%dir%\%yyyymmdd%\%%m"
    )
)

REM %SystemRoot%\explorer.exe %dir%\%yyyymmdd%
REM exit subroutine
exit /b

Thanks for the efforts



来源:https://stackoverflow.com/questions/62206194/move-file-to-trimmed-filename-location-with-full-name-in-batch

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!