【发布时间】:2020-05-01 00:52:10
【问题描述】:
每周,我的一位同事都必须浏览一个文件夹,其中包含 数百个 已解复用的视频和音频文件,为特定城市电视台单独重命名每个文件,然后将它们分类基于城市名称的文件夹。我创建了一个 .bat 文件来为他重命名它们,现在我想创建一个 .bat 文件,它根据文件名创建新目录,并将相应的文件放入新文件夹中。我复制了一些文件进行测试。
因此,最终结果将是一个包含所有相应文件的“Houston”文件夹、一个包含其文件的“Compton”文件夹、一个“Moline”文件夹等等……每个城市,最多大约 200 个城市,而且我们只会越来越多。
他目前正在搜索“Houston”,剪切所有出现的文件,手动创建一个新文件夹,将其命名为“Houston”并将所有文件粘贴到他的新文件夹中。对于每个城市。 200 次。而且需要几个小时。
文件总是用这个系统命名:X### Random City, ST
凭借我的一点编程知识,我假设脚本可以检测到第一个空格之后和逗号之前的所有字符,复制这些字符(随机城市),创建一个新文件夹,将其命名为复制的字符(随机城市)然后将文件名中包含“随机城市”的任何文件移动到新创建的文件夹中。最终结果就是这样,只是多了很多文件夹。
有没有比我更高级的人可以解释这个问题的最佳方法?
如果我在错误的地方或不够精明,我会提前道歉。干杯!
更新:我搞砸了,了解了标记和分隔符、变量等。这是我所拥有的东西,效果非常好,除了我不确定如何删除末尾的逗号城市名称。我使用空格作为分隔符,如果我理解正确,这会使文本块成为标记,包括我的逗号,使用标记=2。出现的另一个问题;假设有一个城市有两个文本块(令牌),例如。旧金山,巴吞鲁日。我怎么能抓住他们两个,用逗号作为我的停止点?我的代码如下。
@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:我找到了一种解决方法来摆脱逗号,将它添加为分隔符,但我仍然试图围绕 2 个单词的城市来解决问题。我的 Baton Rouge 和 San Fransisco 文件夹分别被命名为“Baton”和“San”。这是我目前的代码,如果我找到更好的方法,我会更新。
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
这是我的有效代码。但是,如果文件名前缀/后缀中的字符数发生变化,就会搞砸,您将不得不编辑代码。
@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 个字符,删除逗号并保留城市名称,无论它有多长,或多少个单词它是(例如,佛罗里达州西棕榈滩)。 Antares 在他的回答中提到了这个解决方案,它就像一个魅力。
但这也让我思考
如果前缀中的字符数发生变化(这很可能),我要么必须每次都编辑批处理文件,要么为每种情况创建一个特定的批处理文件。不可怕,但也不是很好。所以我选择了迈克尔希思的答案,它完美无缺。我还不够聪明,无法确切知道原因,但我会剖析它并找出答案。我有很多学习要做。谢谢大家!
【问题讨论】:
-
这里有问题吗?该站点不是代码编写服务,因此在您尝试完成任务之前,即编写脚本、对其进行测试、调试并在此处发布并提供足够的信息以供我们复制您的问题,您的问题是题外话.完成这些问题后,请随时编辑您的问题。
-
谢谢。我是新来的,对一般的编码也很陌生,但谢谢你的帮助。我会继续尝试拼凑一些东西,我会把它发回这里,这是不可避免的问题!
-
我希望没有逗号的文件名是拼写错误,因为您的重命名脚本肯定不会导致命名不一致。
-
Dallas, TX和Dallas, GA的文件会进入同一个Dallas目录吗? -
是的。而且我认为这很混乱,但这就是我们命名文件夹的方式,因为显然我们还没有遇到来自同名城市的 2 个不同站点的问题。显然。然而,这是一个问题,我会写一个留下逗号和后缀的,因为我相信我们会在某个时候需要它。
标签: windows batch-file cmd