我正在运行Windows 7 64位
我有一个目录,里面装满了子目录,每个子目录都有很多文件。
我想写一个批处理文件,它将遍历当前目录中的子目录,将每个子目录中的第一个文件复制到父目录,重命名文件.txt
到目前为止,我有这个:
`for /D %%s in (./*) do
(
cd %%s
i=1
for /f %%a in (./*) do
(
if i==1
cp %%a >> ./../%%s.txt
i=i+1
else
)
cd ..
)`
我得到的只是命令的语法不正确。
我尝试使用回声来查看我能走多远,但我没有越过第一行。
批处理语法非常具体。
for... do (
whatever
if ... (
whatever
) else (
whatever
左括号必须位于指示的位置。 whatever
可能位于下一行或与(
相同的行
如果你有一个语句序列(例如,对于 if-true 条件(,那么这些语句必须用括号括起来
else
前面的右括号必须作为else
在采样物理线上。
cp
无效 - 除非您使用的是 Cygwin,否则该命令copy
i=i+1
无效 - 使用 set /a i=i+1
(算术表达式/a
,否则假定为 s 字符串表达式(
%var%
变量的值。 i
永远不会等于1
,除非在块语句(括号中的语句系列(中,那么您需要调用delayedexpansion
(setlocal
的选项(并使用!var!
因为%var%
解析为解析表达式时var
的值,而不是执行。
/
是开关指示器,而不是目录分隔符。 是一个目录分隔符。Windows通常可以进行替换,但当存在语法时则不然。最好使用正确的字符。
可能包含分隔符(如空格(的"quote"参数。在cd
声明中并不是绝对必要的,但它在那里是无害的,几乎在其他地方都是必需的。
setlocal enabledelayedexpansion
for /D %%s in (.*) do (
cd "%%s"
set /a i=1
for /f %%a in (.*) do (
if !i!==1 (
cOpY %%a >> "...%%s.txt"
set /a i=i+1
) else ( )
cd ..
)
虽然。。。我很想用PUSHD "%%s"
代替第一个cd
,popd
第二个。
不确定您的copy
旨在实现什么。要附加到现有文件,我会使用 type
.有一种copy
语法可以实现append this file to that
但我很少使用它,我不得不查找它。
命令名称/?
从提示将提供(有时晦涩难懂的(文档。
我认为这种方式更简单,更容易理解:
@echo off
setlocal EnableDelayedExpansion
for /D %%s in (*) do (
set "firstFile="
for %%a in ("%%s*.*") do if not defined firstFile set "firstFile=%%a"
copy "!firstFile!" "%%s.txt"
)
对先前代码的观察:
.anyName
虽然正确,但通常从不使用。点表示"当前文件夹",.anyName
表示当前文件夹下方的anyName,这与仅anyName
完全相同。
编辑:复制第N个文件的新方法
@echo off
setlocal EnableDelayedExpansion
for /D %%s in (*) do (
set i=0
for %%a in ("%%s*.*") do (
set /A i+=1
if !i! equ N copy "%%a" "%%s.txt"
)
)
您必须写一个数字来代替上面的N
。