Windows 7 batchfile可在选择第一个文件的子目录中进行迭代
我正在运行64位windows 7 我有一个目录,满是子目录,每个子目录都有很多文件 我想写一个batchfile,它将遍历当前目录中的子目录,将每个子目录中的第一个文件复制到父目录,重命名file.txt 到目前为止,我有:Windows 7 batchfile可在选择第一个文件的子目录中进行迭代,windows,batch-file,Windows,Batch File,我正在运行64位windows 7 我有一个目录,满是子目录,每个子目录都有很多文件 我想写一个batchfile,它将遍历当前目录中的子目录,将每个子目录中的第一个文件复制到父目录,重命名file.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 /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 ..
)`
我得到的只是命令的语法不正确
我已经尝试使用echos来查看我走了多远,但我没有越过第一行。批处理语法非常具体
for... do (
whatever
if ... (
whatever
) else (
whatever
左括号必须位于所示位置<代码>下一行或与(
如果有一系列语句(例如,对于If true条件),则必须将这些括起来
else
前面的右括号必须与else
一样位于samp物理行上
cp
无效-除非您使用的是cygwin,否则命令为copy
i=i+1
无效-使用set/a i=i+1
(/a
用于算术表达式,否则假定为s字符串表达式)
变量值的%var%
。i
将永远不会等于1
,除非在块语句(括号内的一系列语句)中,然后您需要调用延迟扩展
(setlocal
的一个选项)并使用!var!
,因为%var%
解析表达式时被解析为var
的值,而不是执行
/
是一个开关指示符,而不是目录分隔符。\
是一个目录分隔符。Windows通常可以进行替换,但在有语法ambuity时不能。最好使用正确的字符
“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
语法可以实现将此文件附加到该文件上
,但我很少使用它,因此我不得不查找它
命令名/
提示将提供(有时模糊的)文档。我认为这种方式更简单,更容易理解:
@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
。(
与do
在同一行,你还需要使用set
来设置和计算变量。我已经移动了(与do相同,在i=1和i=1+1之前添加了集合;我仍然没有通过第一行-我在cd%%s上方添加了一个回音,但它没有到达。练习的目的是解决一个业务问题,在这个问题中,我有一个满是子目录的目录,每个子目录都有一个同事的名字。每个子目录都有许多图片。)同事的照片。我需要将每个同事的照片复制到父目录,重命名文件,以便获得每个同事的一张单独的、正确命名的照片。您的代码帮助我克服了前两个障碍。我正在通过运行您的setlocal enabledelayedexpansion代码获得命令行输出)在cd之前,我尝试在我预期需要的地方添加一个括号。这并没有改变输出。我移动了括号,使它们位于正确的位置,代码现在运行,这非常棒,但是,我得到的响应是系统找不到文件。/*棒极了,谢谢,这很有效。有没有办法选择第X个文件而不是第一个文件?是的,但这是一个完全不同的问题!只需包含i
变量,并在i
等于N时获取名称。是否要我发布此案例的代码?您是一名明星;现在,您知道如何更换'01路虎发现上的离合器了吗。。。。
@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"
)
)