我正在运行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 ..
)`
我得到的只是命令的语法不正确。
我尝试过使用回声看看我走了多远,而且我没有超越第一线。
答案 0 :(得分:1)
批处理语法非常具体。
for... do (
whatever
if ... (
whatever
) else (
whatever
开括号必须位于指示的位置。 whatever
可能位于以下行或与(
如果您有一系列陈述(例如,对于if-true条件),那么必须为括号
else
之前的闭括号必须在samp物理行上作为else
。
cp
无效 - 除非您使用cygwin,否则命令为copy
i=i+1
无效 - 使用set /a i=i+1
(/a
表示算术表达式,否则假定它是s字符串表达式)
%var%
表示变量的值。 i
永远不会等于1
,除了在一个块语句(带括号的系列语句)中,那么你需要调用delayedexpansion
({{1}的一个选项}})并使用setlocal
,!var!
被解析为表达式已解析时%var%
的值,而不是已执行。
var
是一个开关指示符,而不是目录分隔符。 /
是目录分隔符。 Windows通常可以进行替换,但不会在语法存在时出现问题。最好使用正确的角色。
"报价"可能包含分隔符的参数(如空格。)在\
语句中它不是严格必需的,但它在那里是无害的,几乎在其他任何地方都是必需的。< / p>
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
但我使用它很少,我不得不查找它。
commandname /?
提示中的将提供(有时模糊不清)文档。
答案 1 :(得分:0)
我认为这种方式更简单易懂:
@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,与<{1>}完全相同。编辑:复制第N个文件的新方法
anyName
您必须写一个数字代替上面的@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"
)
)
。