DOS批处理文件 - 根据文件名元素复制文件

时间:2012-11-23 19:36:22

标签: variables batch-file dos filenames

我需要根据文件名对很多文件进行排序。我想使用批处理文件来完成它。我知道我想要什么,但我不确定正确的语法。

我使用的文件名示例:(它们最初都在同一目录中)

2012_W34_Sales_Store001.pdf  
2012_W34_Sales_Store002.pdf  
2012_W34_Sales_Store003.pdf  

2012_November_Sales_Store001.pdf  
2012_November_Sales_Store002.pdf  
2012_November_Sales_Store003.pdf

我想提取位于“_”符号之间的信息,并每次将它们放入不同的变量中。 _符号之间包含的信息的长度每次都会不同。

Example:
var1="2012"
var2="W34" (or November)
var3="Sales"
var4="001"

如果我能够这样做,我可以使用

将文件复制到适当的目录
move %var1%_%var2%_%var3%_%var4%.pdf z:\%var3%\%var4%\%var1%\%var2%

它需要循环,因为我有Store001到Store050。 此外,不仅有销售报告,还有许多其他报告。

我希望我很清楚。

请帮我实现这个批处理文件!

2 个答案:

答案 0 :(得分:0)

此脚本将根据下划线之间的值将文件移动到类似构造的路径。

for %%f in (*.pdf) do call :handlefile %%f

:handlefile
set pad=z:
for /f  "delims= tokens=1,* " %%a in ("%1") do call :step %%a %%b
rem this MOVES the file, maybe use echo first for testing
move "%fn%" "%pad%"
exit /B

:step
if !%2!==!! EXIT /B
set pad=%pad%\%1
for /f  "delims=_ tokens=1,* " %%a in ("%2") do call :step %%a %%b
EXIT /B

答案 1 :(得分:0)

此脚本将确保它只尝试移动符合模式的文件part1_part2_part3_part4.pdf

@echo off
for /f "eol=_ delims=" %%F in (
  'dir /b *^|findstr /ix "[^_]*_[^_]*_[^_]*_[^_]*[.]pdf'
) do for /f "eol=_ tokens=1-4 delims=_." %%A in ("%%F") do (
  move "%%F" "z:\%%C\%%D\%%A\%%B"
)

如果需要,您可以在MOVE之前添加md "z:\%%C\%%D\%%A\%%B" 2>nul,以防文件夹可能尚不存在。