首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理根据多个文件名创建多个文件夹,并将多个相关文件移动到创建的文件夹中

批处理根据多个文件名创建多个文件夹,并将多个相关文件移动到创建的文件夹中
EN

Stack Overflow用户
提问于 2020-05-01 00:52:10
回答 4查看 894关注 0票数 2

每周,我的一位同事都要翻看一个文件夹,里面有数百的已销毁的视频和音频文件,为特定的城市电视台重新命名,然后根据城市的名称将它们分类。我已经创建了一个.bat文件来为他重命名它们,现在我想创建一个.bat文件,它根据文件名创建新的目录,并将相应的文件放入新的文件夹中。我复制了几个要测试的文件。

因此,最终的结果将是一个“休斯顿”文件夹与所有它的相应文件,“康普顿”文件夹与它的文件,一个“莫林”文件夹,等等.对于每一个城市,大约200个城市,和我们只得到更多。

他目前正在搜索“休斯顿”,剪切所有出现的文件,手动创建一个新文件夹,命名为“休斯顿”,并将所有文件粘贴到他的新文件夹中。为每个城市。200次。而且要花上几个小时。

这些文件总是用这个系统命名: X###,兰登城,ST

根据我小小的编程知识,我假设脚本可以检测到第一个空格之后的所有字符,在逗号之前,复制这些字符(随机城市),创建一个新的文件夹,将其命名为复制的字符(随机城市),然后将文件名中包含“随机城市”的任何文件移动到新创建的文件夹中。最终的结果将是这样,只是有更多的文件夹。

还有比我更先进的人能解释最好的方法吗?

如果我来错了地方或者不够精明,我会提前道歉。干杯!

更新:我搞砸了,学习了令牌和分隔符,变量等等。下面是我的工作原理,但我不知道如何删除城市名称末尾的逗号。我使用空格作为分隔符,如果我正确理解(包括逗号),就会使用tokens=2。另一个问题是,假设有一个有两个文本块(记号)的城市。旧金山巴吞鲁日。我怎么能抓住他们两个,用逗号作为我的停止点?我的密码在下面。

代码语言:javascript
复制
@echo off
setlocal enabledelayedexpansion
for %%A in (*.m2v *.mpa) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "tokens=2* delims= " %%D in ("!fname!") do set folname=%%D
   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! doesn't exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished

pause

更新2:我找到了一个meh解决方案,通过添加逗号作为分隔符来消除逗号,但我仍然试图把我的头绕在两个单词城市之间。我的Baton Rouge和San Fransisco文件夹分别被命名为"Baton“和"San”。到目前为止,这是我的代码,如果我找到了更好的方法,我会更新。

代码语言:javascript
复制
setlocal enabledelayedexpansion
for %%A in (*.m2v *.mpa) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "delims=," %%B in ("%%A") do set fname=%%~nB
   for /f "tokens=2* delims= " %%D in ("!fname!") do set folname=%%D
   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! doesn't exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished

pause

更新3

这是我的代码。但是,如果文件名前缀/后缀中的字符数量发生变化,则会导致混乱,您将不得不编辑代码。

代码语言:javascript
复制
@ECHO OFF
SETLOCAL enabledelayedexpansion
FOR %%A in (*.m2v *.mpa) do (
   ECHO file found  %%A
   FOR /F "delims=" %%B in ("%%A") do set fname=%%~nB
   SET folname=!fname:~5,-4!
   ECHO folder name !folname!
   if not exist "!folname!" (
      ECHO Folder !folname! doesn't exist, creating
      MD "!folname!"
   ) else (
      ECHO Folder !folname! exists
   )
   ECHO Moving file %%A to folder !folname!
   MOVE "%%A" "!folname!"
   )
ECHO Finished

PAUSE

使用SET folname=!fname:~5,-4!允许我修剪M373前缀,5个字符在,TX后缀,4个字符在,删除逗号和挽救城市名称,无论它是多长,或有多少字(例如。西棕榈滩,佛罗里达州)。心大二在他的回答中提到了这一解决方案,它的作用就像一种魅力。

但它也让我觉得

如果前缀中的字符数有可能发生变化,我将不得不每次编辑批处理文件,或者为每种情况创建一个特定的批处理文件。不可怕,但也不太好。所以我选择了迈克尔·希思的答案,这个答案完美无缺。我还不太聪明,还不知道原因,但我会把它解剖并找出答案。我有很多事情要学。谢谢大家!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-01 04:46:12

代码语言:javascript
复制
@echo off
setlocal

rem A=Fullpath, B=Name before comma, C=B prefix, D=B without prefix.
for /f "delims=" %%A in ('dir /b *.m2v *.mpa') do (
    for /f "delims=," %%B in ("%%~nA") do (
        for /f "tokens=1,*" %%C in ("%%~B") do (

            if not exist "%%~D\" (
                echo Folder "%%~D" doesn't exist, creating
                md "%%~D"
            )

            if exist "%%~D\" (
                echo Moving file "%%~A" to folder "%%~D\"
                move /y "%%~A" "%%~D\"
            ) else echo Folder "%%~D\" doesn't exist
        )
    )
)

echo Finished
pause

3个for循环,以获得所需的令牌。

  • 第一名将获得完整的路径。
  • 第二,在逗号之前得到名字。
  • 第三,得到没有前缀的名字。

在嵌套的for循环中,检查文件夹是否存在,如果不存在,则创建它。如果文件夹存在,请将文件移动到内部。

票数 0
EN

Stack Overflow用户

发布于 2020-05-01 05:06:09

我可以给你一些提示。如果你有一个更具体的问题,可以随时更新你的问题。

您可以剪切像这样的字符串的最后X字符:%variablename:~0,-X%

如果您知道城市部分的变量,例如%D和%%E等,您可以像这个md "%%D %%E"那样再次连接它们。但是,这只适用于固定数量的令牌,如这里的两个。

如果需要for-循环之外的结果,可以将这些连接存储在自己的变量中。例如,使用set myVariable=%%D %%E,并使用%myVariable%!myVariable! (当需要延迟扩展时)显示它,例如md "%myVariable%"

一个巧妙的解决办法:如果只有少数“特殊城市”需要考虑,那么您只需在脚本的末尾添加一些重命名命令,比如rename San "San Francisco"rename Baton "Baton Rouge"等。如果有更多的"San“城市,就不能正常工作。(“圣伯纳迪诺”),因为这不能再被区分了。但是在这种情况下,复制到单独的文件夹也会失败。

在您的脚本中,您将检查现有文件夹。我想你可以省略这个。mdmkdir要么创建该目录,要么不做任何操作。嗯,他们在控制台上打印了一条消息,这是可以忽略的。如果您不想看到它们,请将错误消息流重定向到nul,如下面的md myFolder 2>nul。这将吞下任何错误消息,但不太可能得到任何其他错误消息,而不是在您的场景中。

您可以这样简化您的方法:我认为您的文件重命名工作得很好。您的“复制”脚本可能只是明确声明的命令列表(如果要考虑新的城市,也可以相当快地编辑)。

按照下面的方式设置批处理文件,并为每个城市设置条目:

代码语言:javascript
复制
@echo off
mkdir "Moline"
copy "*Moline*.*" "Moline"

mkdir "San Francisco"
copy "*San Francisco*.*" "San Francisco"

...

echo done.

副作用是,每个城市的文件夹将被创建,而不仅仅是那些文件被复制到的地方。也许它能满足你的需要。

此外,我还想为您提供帮助/文档来源的指针:

在命令行上,您可以通过执行批处理文件中使用的命令并附加/?来获得广泛的帮助。例如,set /?为您提供了许多使用变量/字符串操作可以做的有用事情。

试试:for /?if /? (比如errorlevel ),可能是call /?goto /?等等。

所有命令行命令的一个非常好的来源是https://www.ss64.com。这个站点甚至为PowerShell和Linux等人提供了广泛的帮助。在本例中与您相关的是CMD,直接链接:https://ss64.com/nt/

Edit/Update:

请查看set命令中的符号替换,以构建以下内容

代码语言:javascript
复制
if "%myVariable:~0,1%" == "M" (set myvariable=%myvariable:~1%)

第一部分“裁剪”第一个字符并检查它是否为M,如果是,则保留除第一个字符之外的所有内容。有了这个,您可以使您的文件名均匀地在批处理文件中处理它们。

您还可以用%myVariable:, TX=%“删除”一个字母或子字符串,例如用"nothing“替换任何",TX”。

哦,这也可以帮助删除文件名中的任何空格。然后,您可以在没有空格问题的情况下提取"SanFrancisco“;)文件夹名将没有空格。最后可以通过进一步的rename命令来解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2020-05-01 06:30:37

这是我的代码。但是,如果文件名前缀/后缀中的字符数量发生变化,则会导致混乱,您将不得不编辑代码。

代码语言:javascript
复制
@ECHO OFF
SETLOCAL enabledelayedexpansion
FOR %%A in (*.m2v *.mpa) do (
   ECHO file found  %%A
   FOR /F "delims=" %%B in ("%%A") do set fname=%%~nB
   SET folname=!fname:~5,-4!
   ECHO folder name !folname!
   if not exist "!folname!" (
      ECHO Folder !folname! doesn't exist, creating
      MD "!folname!"
   ) else (
      ECHO Folder !folname! exists
   )
   ECHO Moving file %%A to folder !folname!
   MOVE "%%A" "!folname!"
   )
ECHO Finished

PAUSE

使用SET folname=!fname:~5,-4!允许我修剪M373前缀,5个字符在,TX后缀,4个字符在,删除逗号和挽救城市名称,无论它是多长,或有多少字(例如。西棕榈滩,佛罗里达州)。心大二在他的回答中提到了这一解决方案,它的作用就像一种魅力。

但它也让我觉得

如果前缀中的字符数有可能发生变化,我将不得不每次编辑批处理文件,或者为每种情况创建一个特定的批处理文件。不可怕,但也不太好。所以我选择了迈克尔·希思的答案,这个答案完美无缺。我还不太聪明,还不知道原因,但我会把它解剖并找出答案。我有很多事情要学。谢谢大家!前像 后像

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61535228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档