要循环访问子目录的 Windows 7 批处理文件,选择第一个文件



我正在运行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"代替第一个cdpopd第二个。

不确定您的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

最新更新