Windows 7批处理文件迭代子目录选择第一个文件

时间:2014-12-22 03:49:59

标签: windows batch-file

我正在运行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 ..
)`

我得到的只是命令的语法不正确。

我尝试过使用回声看看我走了多远,而且我没有超越第一线。

2 个答案:

答案 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通常可以进行替换,但不会在语法存在时出现问题。最好使用正确的角色。

&#34;报价&#34;可能包含分隔符的参数(如空格。)在\语句中它不是严格必需的,但它在那里是无害的,几乎在其他任何地方都是必需的。< / 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" ) )