使用批处理脚本组织文件
Organize files with batch script
我需要以某种方式将所有文件从源文件夹(包括子文件夹)复制到目标文件夹,并将子文件夹名称作为文件名。
在 windows 上使用批处理文件。
示例:
sourceFolder\packed1.bin
sourceFolder\data1\packed1.bin
sourceFolder\data1\packed2.bin
sourceFolder\data1\zz\packed1.bin
sourceFolder\data1\aa\packed1.bin
sourceFolder\data1\aa\packed1.bin
应该变成...
destinationFolder\packed1.bin
destinationFolder\data1-packed1.bin
destinationFolder\data1-packed2.bin
destinationFolder\data1-zz-packed1.bin
destinationFolder\data1-aa-packed1.bin
destinationFolder\data1-aa-22-packed1.bin
我尝试使用 goto
但我无法跟踪我所在的目录然后 return 到它。
@echo off
setlocal EnableDelayedExpansion
set mypath=%cd%
set "_orig=%mypath%\datafolder"
set "_origCurr=%_orig%"
set "_dest=%mypath%\untree\"
set procDirs
set /a procDirsL=0
set currDirS=""
set /a isProc=0
:gofolders
for /d %%D in ("%_dest%\*.*") do (
set currDirS=%currDirS%\%%D
set procDirs[!procDirsL!]
set /a procDirsL=!procDirsL!+1
goto gofolders
)
:dofiles
for /f %%F in ("%_dest%\*.*") do (
)
goto gofolders
@echo off
setlocal
rem Set target and destination paths.
set "target=%cd%\sourceFolder"
set "dest=%cd%\destinationFolder"
rem Make dest dir if needed.
if not exist "%dest%" md "%dest%"
rem Recurse target and get filepath of .bin files.
for /r "%target%" %%A in (*.bin) do call :moveToDest %%A
exit /b
:moveToDest
setlocal
set "oldname=%~1"
rem Remove target from the filepath.
call set "newname=%%oldname:%target%=%%"
if not defined newname (
>&2 echo target is undefined
exit /b 1
)
rem Remove leading \.
if "%newname:~,1%" == "\" set "newname=%newname:~1%"
rem Replace \ with -.
set "newname=%newname:\=-%"
rem Copy new named file to dest.
copy "%oldname%" "%dest%\%newname%" >nul
if errorlevel 1 (
>&2 echo Failed to copy "%oldname%" to "%dest%\%newname%"
exit /b 1
)
exit /b
执行前设置target
和dest
。
因为目标文件被重命名并复制到
没有子文件夹结构的目的地,使
目标文件夹只在开始时完成一次。
目标文件夹使用 for
循环递归
并获取 .bin
文件的所有完整路径。
使用参数调用标签 :moveToDest
每个 .bin
文件的完整路径。
在标签:moveToDest
中,参数传递
设置为 oldname
。目标路径被移除
和前导反斜杠(如果需要)。这设置了旧名称
作为目标路径的相对路径。
反斜杠替换为破折号以创建
复制的文件名。复制 .bin
文件
使用 copy
从目标复制到
新文件名的目的地。
我需要以某种方式将所有文件从源文件夹(包括子文件夹)复制到目标文件夹,并将子文件夹名称作为文件名。
在 windows 上使用批处理文件。
示例:
sourceFolder\packed1.bin
sourceFolder\data1\packed1.bin
sourceFolder\data1\packed2.bin
sourceFolder\data1\zz\packed1.bin
sourceFolder\data1\aa\packed1.bin
sourceFolder\data1\aa\packed1.bin
应该变成...
destinationFolder\packed1.bin
destinationFolder\data1-packed1.bin
destinationFolder\data1-packed2.bin
destinationFolder\data1-zz-packed1.bin
destinationFolder\data1-aa-packed1.bin
destinationFolder\data1-aa-22-packed1.bin
我尝试使用 goto
但我无法跟踪我所在的目录然后 return 到它。
@echo off
setlocal EnableDelayedExpansion
set mypath=%cd%
set "_orig=%mypath%\datafolder"
set "_origCurr=%_orig%"
set "_dest=%mypath%\untree\"
set procDirs
set /a procDirsL=0
set currDirS=""
set /a isProc=0
:gofolders
for /d %%D in ("%_dest%\*.*") do (
set currDirS=%currDirS%\%%D
set procDirs[!procDirsL!]
set /a procDirsL=!procDirsL!+1
goto gofolders
)
:dofiles
for /f %%F in ("%_dest%\*.*") do (
)
goto gofolders
@echo off
setlocal
rem Set target and destination paths.
set "target=%cd%\sourceFolder"
set "dest=%cd%\destinationFolder"
rem Make dest dir if needed.
if not exist "%dest%" md "%dest%"
rem Recurse target and get filepath of .bin files.
for /r "%target%" %%A in (*.bin) do call :moveToDest %%A
exit /b
:moveToDest
setlocal
set "oldname=%~1"
rem Remove target from the filepath.
call set "newname=%%oldname:%target%=%%"
if not defined newname (
>&2 echo target is undefined
exit /b 1
)
rem Remove leading \.
if "%newname:~,1%" == "\" set "newname=%newname:~1%"
rem Replace \ with -.
set "newname=%newname:\=-%"
rem Copy new named file to dest.
copy "%oldname%" "%dest%\%newname%" >nul
if errorlevel 1 (
>&2 echo Failed to copy "%oldname%" to "%dest%\%newname%"
exit /b 1
)
exit /b
执行前设置target
和dest
。
因为目标文件被重命名并复制到 没有子文件夹结构的目的地,使 目标文件夹只在开始时完成一次。
目标文件夹使用 for
循环递归
并获取 .bin
文件的所有完整路径。
使用参数调用标签 :moveToDest
每个 .bin
文件的完整路径。
在标签:moveToDest
中,参数传递
设置为 oldname
。目标路径被移除
和前导反斜杠(如果需要)。这设置了旧名称
作为目标路径的相对路径。
反斜杠替换为破折号以创建
复制的文件名。复制 .bin
文件
使用 copy
从目标复制到
新文件名的目的地。