windows 如何从文件名的一部分创建批处理文件夹,将文件移动到名称已修改的文件夹中?

tyu7yeag  于 2023-01-02  发布在  Windows
关注(0)|答案(1)|浏览(205)

我有一个具有以下文件名的文件列表
gml_对象_对象_A脚本_0.txt
gml_对象
对象_B_脚本_1.txt
其中obj_A,obj_B是对象的名称,Script_0,Script_1 是文件名
我需要一个Windows批处理文件来创建基于对象名称的文件夹,然后将文件移动到每个文件夹并重命名
在上面的示例中,使用批处理文件后,我将拥有2个文件夹
文件夹obj_A,包含文件 Script_0.txt
文件夹obj_B,包含文件 Script_1.txt
到目前为止,我在这里遇到了一个不错的帖子How do I create folder from file name and move files into folder?
但是我不擅长使用Windows批处理命令,所以我不能修改它来满足我的需要
这是我的代码(这是不工作)

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=E:\TestBatch"
set "DestDir=E:\TestBatch"

for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%\gml_Object_obj_*" 2^>nul') do (
    for /F "eol=| tokens=2 delims=_" %%B in ("%%~nA") do (
        md "%DestDir%\%%B" 2>nul
        set "FileName=%%A"
        call move /Y "%SourceDir%\%%A" "%DestDir%\%%B\%%FileName:~3%%"
    )
)
endlocal

运行此代码后的结果是一个名为“Object”的文件夹,其中包含2个文件
_Object_obj_A_Script_0.txt
_Object_obj_B_Script_1.txt

kgsdhlau

kgsdhlau1#

分析您的代码
%%A将包含文件名,例如gml_Object_obj_A_Script_0.txt
%%B被设置为%%~nA的第二个以_分隔的标记,即Object。(~n选取%%An部分,因此在此无关紧要)
使用%%B = Object建立目标目录
filename设置为%%A = gml_Object_obj_A_Script_0.txt
move命令被调用。

move /Y "E:\TestBatch\gml_Object_obj_A_Script_0.txt" "E:\TestBatch\Object\%FileName:~3%"

其中filename设置为gml_Object_obj_A_Script_0.txt,因此move文件名为gml_Object_obj_A_Script_0.txt(前3个字符除外),因此为_Object_obj_A_Script_0.txt
看来Stephan已经错过了call关键字。
所以-所以你的代码才会这么做。

@ECHO Off
SETLOCAL
rem The following settings for the directories and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"

for /F "eol=| delims=" %%E in ('dir /B /A-D-H "%SourceDir%\gml_Object_obj_*" 2^>nul') do (
 for /F "eol=| tokens=3,4* delims=_" %%U in ("%%E") do (
  md "%DestDir%\%%U_%%V" 2>nul
  move /Y "%SourceDir%\%%E" "%DestDir%\%%U_%%V\%%W" >nul
 )
)

GOTO :EOF
    • 在应用于实际数据之前,始终根据测试目录进行验证。**
I prefer to avoid ADFNPSTXZ (in either case) as metavariables (loop-control variables) 
ADFNPSTXZ are also metavariable-modifiers which can lead to difficult-to-find bugs 
(See `for/f` from the prompt for documentation)

我的代码:(我将使用您的directorynames)
%%E将包含文件名,例如gml_Object_obj_A_Script_0.txt
%%U被设置为%%A的第三个以_分隔的标记,即obj%%V到第四个、A%%W到余数Script_0.txt
使用%%U_%%V = obj_A建立目标目录
将执行move命令

move /Y "E:\TestBatch\gml_Object_obj_A_Script_0.txt" "E:\TestBatch\obj_A\Script_0.txt"

相关问题