我在四个文件夹中有相同的文件(名为" 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'
初学者的任何提示?谢谢!
答案 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
将被禁止......