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

因此,最终的结果将是一个“休斯顿”文件夹与所有它的相应文件,“康普顿”文件夹与它的文件,一个“莫林”文件夹,等等.对于每一个城市,大约200个城市,和我们只得到更多。
他目前正在搜索“休斯顿”,剪切所有出现的文件,手动创建一个新文件夹,命名为“休斯顿”,并将所有文件粘贴到他的新文件夹中。为每个城市。200次。而且要花上几个小时。
这些文件总是用这个系统命名: X###,兰登城,ST
根据我小小的编程知识,我假设脚本可以检测到第一个空格之后的所有字符,在逗号之前,复制这些字符(随机城市),创建一个新的文件夹,将其命名为复制的字符(随机城市),然后将文件名中包含“随机城市”的任何文件移动到新创建的文件夹中。最终的结果将是这样,只是有更多的文件夹。

还有比我更先进的人能解释最好的方法吗?
如果我来错了地方或者不够精明,我会提前道歉。干杯!
更新:我搞砸了,学习了令牌和分隔符,变量等等。下面是我的工作原理,但我不知道如何删除城市名称末尾的逗号。我使用空格作为分隔符,如果我正确理解(包括逗号),就会使用tokens=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:我找到了一个meh解决方案,通过添加逗号作为分隔符来消除逗号,但我仍然试图把我的头绕在两个单词城市之间。我的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个字符在,删除逗号和挽救城市名称,无论它是多长,或有多少字(例如。西棕榈滩,佛罗里达州)。心大二在他的回答中提到了这一解决方案,它的作用就像一种魅力。
但它也让我觉得
如果前缀中的字符数有可能发生变化,我将不得不每次编辑批处理文件,或者为每种情况创建一个特定的批处理文件。不可怕,但也不太好。所以我选择了迈克尔·希思的答案,这个答案完美无缺。我还不太聪明,还不知道原因,但我会把它解剖并找出答案。我有很多事情要学。谢谢大家!


发布于 2020-05-01 04:46:12
@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
pause3个for循环,以获得所需的令牌。
在嵌套的for循环中,检查文件夹是否存在,如果不存在,则创建它。如果文件夹存在,请将文件移动到内部。
发布于 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“城市,就不能正常工作。(“圣伯纳迪诺”),因为这不能再被区分了。但是在这种情况下,复制到单独的文件夹也会失败。
在您的脚本中,您将检查现有文件夹。我想你可以省略这个。md或mkdir要么创建该目录,要么不做任何操作。嗯,他们在控制台上打印了一条消息,这是可以忽略的。如果您不想看到它们,请将错误消息流重定向到nul,如下面的md myFolder 2>nul。这将吞下任何错误消息,但不太可能得到任何其他错误消息,而不是在您的场景中。
您可以这样简化您的方法:我认为您的文件重命名工作得很好。您的“复制”脚本可能只是明确声明的命令列表(如果要考虑新的城市,也可以相当快地编辑)。
按照下面的方式设置批处理文件,并为每个城市设置条目:
@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命令中的符号替换,以构建以下内容
if "%myVariable:~0,1%" == "M" (set myvariable=%myvariable:~1%)第一部分“裁剪”第一个字符并检查它是否为M,如果是,则保留除第一个字符之外的所有内容。有了这个,您可以使您的文件名均匀地在批处理文件中处理它们。
您还可以用%myVariable:, TX=%“删除”一个字母或子字符串,例如用"nothing“替换任何",TX”。
哦,这也可以帮助删除文件名中的任何空格。然后,您可以在没有空格问题的情况下提取"SanFrancisco“;)文件夹名将没有空格。最后可以通过进一步的rename命令来解决这个问题。
发布于 2020-05-01 06:30:37
这是我的代码。但是,如果文件名前缀/后缀中的字符数量发生变化,则会导致混乱,您将不得不编辑代码。
@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个字符在,删除逗号和挽救城市名称,无论它是多长,或有多少字(例如。西棕榈滩,佛罗里达州)。心大二在他的回答中提到了这一解决方案,它的作用就像一种魅力。
但它也让我觉得
如果前缀中的字符数有可能发生变化,我将不得不每次编辑批处理文件,或者为每种情况创建一个特定的批处理文件。不可怕,但也不太好。所以我选择了迈克尔·希思的答案,这个答案完美无缺。我还不太聪明,还不知道原因,但我会把它解剖并找出答案。我有很多事情要学。谢谢大家!前像 后像
https://stackoverflow.com/questions/61535228
复制相似问题