文件合并的简单批处理脚本 - 初学者问题

时间:2014-07-29 22:46:45

标签: windows batch-file cmd batch-rename

我在四个文件夹中有相同的文件(名为" 1"," 2"," 3"," 4")喜欢将这些文件复制到一个文件夹中,原始文件夹名称附加到文件名。

E.g。一个名为" data.txt"的文件应该将每个文件夹中的文件名复制到一个新的合并文件夹,文件名如" data 1.txt" "数据2.txt"等

这是我到目前为止所做的,但我从未正式学过批处理脚本(并且找不到任何体面的教程 - 建议吗?)并且似乎无法使其正常工作。希望这可以让我知道我想要完成的任务。

DIR="$( dirname "$0" )" && pwd )" // I don't understand this but was told it's 
                                  // necessary to set the working directory as 
                                  // the current folder? Is that correct?
md "consolidated files"
for %%i in ("1","2","3","4") do
    copy *.txt '../consolidated files/"*"+%%i.txt'

初学者的任何提示?谢谢!

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
PUSHD "U:\sourcedir"
MD "consolidated files" 2>nul
for %%i in ("1","2","3","4") DO (
 FOR /f "delims=" %%m IN ('dir /b /a-d ".\%%~i\*.txt"') DO (
  copy ".\%%~i\%%m" ".\consolidated files\%%~nm %%~i%%~xm"
 )
)
popd
GOTO :EOF

您尝试设置dir似乎是 bash 命令 - 在* nix上很有用,但在CMD上没有用。

基本上,您可以使用cd

设置当前目录
cd "c:\your\desired directory"

奇怪的是,特定命令中的引号实际上是不必要的(但不要伤害,所以我把它们放进去。)

另一种方法是

pushd "c:\your\desired directory"
rem commands following have current directory "c:\your\desired directory"
rem
popd
rem current directory reestored to value before the "pushd"

我在上面的脚本中使用了第二种方法暂时切换到我的测试目录U:\sourcedir

请注意,cmd使用\作为目录分隔符,使用/作为切换指示符。

md命令与您一样。除非指定了路径,否则将相对于当前目录创建目录(例如md "C:\somewhere new"). The 2> nul suppresses the目录已存在`消息,如果目录er已经存在。

for...do语句中,目标操作必须与do位于同一行,或者do必须后跟 Space (和然后是每个语句,直到匹配的)作为复合语句执行。

for..%%i语句将值"1" .. "4"(包括引号)分配给%%i在这种情况下实际上不需要引号 - 它们只是 Space (或其他分隔符),则需要。

从中间可以最好地理解下一个命令。 dir命令在“。\ %% ~i \”中查找名为*.txt的文件。 ~i表示“从%% i中移除引号”。 /b开关只显示文件名 - 没有大小,日期或页眉/页脚。 /a-d开关显示“没有目录”。

dir命令位于单引号内。 FOR /f ...('single-quoted command')...处理命令的结果,就像它是一个文件一样,逐行处理。 "delims="会抑制找到的字符串的默认标记,因此总体而言,dir找到的文件名将被归为%%m

然后执行的命令是copy,从".\%%~i\%%m"复制(即当前目录++子目录(-quotes)++文件名;所有引用的空格)到{{ 1}}(即当前目录+ \合并文件+文件名的名称部分(%%〜nm)+ 空格 +子目录(-quotes)+文件名的扩展部分(%) %〜XM))

请注意".\consolidated files\%%~nm %%~i%%~xm"是一个有效的文件名字符(就像+一样),并且只是通过与下一个字符串对接来构建字符串。

您的原始问题声明源目录名应附加在空格后面,因此我已将空格包含在内。

请注意,'会在每次复制后报告copy。您可以通过将1 file(s) copied添加到>nul语句的末尾来取消此操作。

为了进行测试,我会将copy更改为copy,这将显示生成的命令但不执行它。不幸的是,如果你有echo copy,那么该命令的>nul将被禁止......