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!")

这是一个你想要的脚本。它从最后一个脚本中分离出来