批量文件搜索&创建多个单词

时间:2014-01-19 02:12:20

标签: search batch-file directory

我需要你的帮助,我在这种类型的脚本方面相当新,我需要你的帮助来尝试使这个脚本正常运行。

我有一个脚本在文件夹中搜索文件,并在文件第一个字符后将它们移动到文件夹名称。但是当文件被多个“。”分隔时,我遇到了一个问题。

setlocal EnableDelayedExpansion   
set "IncomingFolder=D:\Test"   
set "showsFolder=D:\Test\"

for %%F in ("%incomingFolder%\*.S*.*") do (   for /f "delims=.S" %%A in ("%%~nF") do (
if not exist "%showsFolder\%" md "%showsFolder%\%%A"
move "%%F" "%showsFolder%\%%A"   ) )

例如: 如果文件是Hustle.SXX.XXX那么它会生成名为“Hustle”的正确文件夹。 但是如果它被命名为The.Hustle.SXXX.XXX那么它只创建一个名为“The”的文件夹,我需要它使用整个名称直到“.S”。

有谁可以帮我解决这个问题?

4 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
set "IncomingFolder=c:\sourcedir"   
set "showsFolder=D:\Test"

for %%F in ("%incomingFolder%\*.S*.*") do (for /f "delims=." %%A in ("%%~nF") do (
 ECHO md "%showsFolder%\%%A"
 ECHO move "%%F" "%showsFolder%\%%A\"
 )
)

GOTO :EOF

我已经更改了目录名称以适合我的系统。

我无法重新创建您描述的问题,但delims=.S会使分隔符. S而不是.S。这可能就是你所看到的。

所需的MD命令仅用于ECHO用于测试目的。在确认命令正确后,将ECHO MD更改为MD以实际创建目录。附加2>nul以禁止错误消息(例如,当目录已存在时)

此外,为了测试目的,所需的MOVE命令仅为ECHO。在确认命令正确无误后,将ECHO MOVE更改为MOVE以实际移动文件。附加>nul以取消报告消息(例如1 file moved

答案 1 :(得分:1)

您不能使用FOR / F从前面解析,因为您不知道名称中可能出现多少.。我假设你期待像part1.part2.Spart3.part4这样的名字,但不像part1.part2.Spart3.part4.part5。换句话说 - 你不想在.S之后有两个点。如果是这样,那么你可以安全地删除倒数第二个点之后的所有内容。这可以使用~n修饰符两次轻松完成。

for %%F in ("%incomingFolder%\*.S*.*") do for %%A in ("%%~nF") do (
  if not exist "%showsFolder%\%%~nA" md "%showsFolder%\%%~nA"
  move "%%F" "%showsFolder%\%%~nA\"
)

(由Magoo发痒 - %在“传入”上失踪,而~n在移动目的地上需要

答案 2 :(得分:0)

这使用名为repl.bat的帮助程序批处理文件 - 从https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

下载

repl.bat放在与批处理文件相同的文件夹中或放在路径上的文件夹中。

测试一下,看看它是怎么回事:

@echo off
set "IncomingFolder=D:\Test"   
set "showsFolder=D:\Test"

for %%F in ("%incomingFolder%\*.S*.*") do (
   for /f "delims=" %%A in (' echo "%%~nF"^|repl ".(.*)S\d\d.*" "$1" ') do (
      md "%showsFolder%\%%A" 2>nul
      move "%%F" "%showsFolder%\%%A"
   ) 
)

答案 3 :(得分:0)

setlocal EnableDelayedExpansion   
set "IncomingFolder=D:\Test"   
set "showsFolder=D:\Test"

for %%F in ("%incomingFolder%\*.S*.*") do (
   set "file=%%~nF"
   for /F "delims=" %%A in ("!file:*.S=!") do set "folder=!file:.S%%~A=!"
   if not exist "%showsFolder%\!folder!" md "%showsFolder%\!folder!"
   move "%%F" "%showsFolder%\!folder!"
)
  • set "file=%%~nF"获取文件名,例如:set "file=The.Hustle.SXXX.XXX"
  • !file:*.S=!是第一个“.S”之后的部分,例如XXX.XXX,所以
  • set "folder=!file:.S%%~A=!"是没有“.SXXX.XXX”的文件名,例如:“The.Hustle”