Windows 根据文件名将文件移动到文件夹中
我有以下表格中的一些文件: …其中Windows 根据文件名将文件移动到文件夹中,windows,batch-file,cmd,Windows,Batch File,Cmd,我有以下表格中的一些文件: …其中filename可以包含空格 我想将它们分别移动到文件夹filename1,filename2,等等 我知道我可以在(*.ext)中为%%I执行循环,并使用设置文件夹=%%~ni删除扩展名。因此,我缺少的是如何删除数字前空格后的所有内容,例如,仅获取filename1 我还知道我可以拆分变量文件夹,但在这种情况下,我不知道需要拆分哪个字符,尽管我知道它将是一个空格,后跟一个数字 所以基本上,我想要这样的东西: @echo off set folder= for
filename
可以包含空格
我想将它们分别移动到文件夹filename1
,filename2
,等等
我知道我可以在(*.ext)中为%%I执行循环,并使用设置文件夹=%%~ni
删除扩展名。因此,我缺少的是如何删除数字前空格后的所有内容,例如,仅获取filename1
我还知道我可以拆分变量文件夹
,但在这种情况下,我不知道需要拆分哪个字符,尽管我知道它将是一个空格,后跟一个数字
所以基本上,我想要这样的东西:
@echo off
set folder=
for %%i in (*.ext) do set folder=%%~ni & set folder=getfoldernamefromvariablefoldersomehow & mv %%i %folder%
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d“%sourcedir%\*.ext”'
)做(
调用:sub1“%%a”%%a
)
后藤:EOF
:sub1
设置“文件名=%~1”
:子循环
移位
设置“numname=%~1”
如果不是“%~2”==”转到子循环
调用集“dirname=%%文件名:%numname%=%%”
回显(MD“%sourcedir%\%dirname%”2>nul
回显(移动“%sourcedir%\%filename%”“%sourcedir%\%dirname%\%numname%”
后藤:eof
您需要更改sourcedir
的设置以适应您的环境
所需的MD命令仅用于测试目的。ECHO
ed。验证命令正确后,将ECHO(MD
更改为MD
,以实际创建目录
所需的移动命令仅用于测试。ECHO
在验证命令正确后,更改ECHO(MOVE
至MOVE
以实际移动文件。追加>nul
以抑制报告消息(例如1个文件已移动
)
以不带目录名的基本格式执行所需文件的目录列表。将带引号和不带引号的完整fulename发送到子例程sub1
在子例程中,将源文件名保存在filename
中,然后移动提供的每个参数,直到没有第二个参数;numname
中的值必须是最后一个或所需的文件名
从filename
中删除带有前导空格的numname
,以获取所需的子目录名称,创建该子目录并移动文件
[根据评论进行编辑]
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d“%sourcedir%\*.ext”'
)做(
调用:sub1“%%a”%%a
)
后藤:EOF
:sub1
设置“文件名=%~1”
设置“destdirname=%~2”
:子循环
移位
设置“numname=%~1”
如果不是“%~2”==”转到子循环
调用集“dirname=%%文件名:%numname%=%%”
回显(MD“%sourcedir%\%destdirname%”2>nul
回显(移动“%sourcedir%\%filename%”“%sourcedir%\%destdirname%\%numname%”
后藤:eof
如果你不举一个例子,就很难看出你的意图
destdirname
在输入sub1
时设置为第二个参数,该参数将是第一个空格前的第一组字符
md
无需选通,因为2>nul
将抑制目录存在的错误消息。@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d“%sourcedir%\*.ext”'
)做(
调用:sub1“%%a”%%a
)
后藤:EOF
:sub1
设置“文件名=%~1”
:子循环
移位
设置“numname=%~1”
如果不是“%~2”==”转到子循环
调用集“dirname=%%文件名:%numname%=%%”
回显(MD“%sourcedir%\%dirname%”2>nul
回显(移动“%sourcedir%\%filename%”“%sourcedir%\%dirname%\%numname%”
后藤:eof
您需要更改sourcedir
的设置以适应您的环境
所需的MD命令仅用于测试目的。ECHO
ed。验证命令正确后,将ECHO(MD
更改为MD
,以实际创建目录
所需的移动命令仅用于测试。ECHO
在验证命令正确后,更改ECHO(MOVE
至MOVE
以实际移动文件。追加>nul
以抑制报告消息(例如1个文件已移动
)
以不带目录名的基本格式执行所需文件的目录列表。将带引号和不带引号的完整fulename发送到子例程sub1
在子例程中,将源文件名保存在filename
中,然后移动提供的每个参数,直到没有第二个参数;numname
中的值必须是最后一个或所需的文件名
从filename
中删除带有前导空格的numname
,以获取所需的子目录名称,创建该子目录并移动文件
[根据评论进行编辑]
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d“%sourcedir%\*.ext”'
)做(
调用:sub1“%%a”%%a
)
后藤:EOF
:sub1
设置“文件名=%~1”
设置“destdirname=%~2”
:子循环
移位
设置“numname=%~1”
如果不是“%~2”==”转到子循环
调用集“dirname=%%文件名:%numname%=%%”
回显(MD“%sourcedir%\%destdirname%”2>nul
回显(移动“%sourcedir%\%filename%”“%sourcedir%\%destdirname%\%numname%”
后藤:eof
如果你不举一个例子,就很难看出你的意图
destdirname
在输入sub1
时设置为第二个参数,该参数将是第一个空格前的第一组字符
md
无需选通,因为2>nul
将抑制目录存在的错误消息。感谢大家的评论。最后,我得到了一个解决方案:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_source=C:\Users\kurok_000\Downloads"
set "_target=C:\Users\kurok_000\YandexDisk\Mangas"
for /f "eol=| delims=" %%f in ('dir /b "%_source%\*.7z"') do (
call :fixNames "%%f" %_source%
)
for /f "eol=| delims=" %%f in ('dir /b "%_source%\*.7z" ^| findstr /r /i /c:" [0123456789][0123456789]*\.7z$"') do (
set "file=%%f"
call :split last rest "%%f"
setlocal EnableDelayedExpansion
2> nul mkdir "!_target!\!rest!"
move /y "!_source!\!file!" "!_target!\!rest!" >nul
echo moved %%f to !_target!\!rest!
endlocal
)
endlocal
exit /b
:split rtn_last rtn_rest val_string
setlocal DisableDelayedExpansion
set "res=" & set "str=%~3"
:loop
for /f "tokens=1,* delims= " %%i in ("%str%") do (
if "%%j"=="" (
set "res=%%i"
) else (
set "str=%%j"
goto :loop
)
)
:quit
set "str=%~3|"
call set "str=%%str: %res%|=%%"
(
endlocal
set "%~1=%res%"
set "%~2=%str:^^=^%"
)
exit /b
:fixNames _file _folder
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FILE=%1"
set "FILE=%file:~1,-1%"
set "folder=%2"
for /F "tokens=1,* delims=0123456789" %%A in ("%FILE%") do (
set filename=!FILE:%%B=!%%~xB
)
if not "%filename%"=="%FILE%" (rename "!folder!\!FILE!" "!filename!")
感谢大家的评论。最后,我得到了一个解决方案:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_source=C:\Users\kurok_000\Downloads"
set "_target=C:\Users\kurok_000\YandexDisk\Mangas"
for /f "eol=| delims=" %%f in ('dir /b "%_source%\*.7z"') do (
call :fixNames "%%f" %_source%
)
for /f "eol=| delims=" %%f in ('dir /b "%_source%\*.7z" ^| findstr /r /i /c:" [0123456789][0123456789]*\.7z$"') do (
set "file=%%f"
call :split last rest "%%f"
setlocal EnableDelayedExpansion
2> nul mkdir "!_target!\!rest!"
move /y "!_source!\!file!" "!_target!\!rest!" >nul
echo moved %%f to !_target!\!rest!
endlocal
)
endlocal
exit /b
:split rtn_last rtn_rest val_string
setlocal DisableDelayedExpansion
set "res=" & set "str=%~3"
:loop
for /f "tokens=1,* delims= " %%i in ("%str%") do (
if "%%j"=="" (
set "res=%%i"
) else (
set "str=%%j"
goto :loop
)
)
:quit
set "str=%~3|"
call set "str=%%str: %res%|=%%"
(
endlocal
set "%~1=%res%"
set "%~2=%str:^^=^%"
)
exit /b
:fixNames _file _folder
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FILE=%1"
set "FILE=%file:~1,-1%"
set "folder=%2"
for /F "tokens=1,* delims=0123456789" %%A in ("%FILE%") do (
set filename=!FILE:%%B=!%%~xB
)
if not "%filename%"=="%FILE%" (rename "!folder!\!FILE!" "!filename!")
这是一个你想要的脚本。它从最后一个脚本中分离出来