Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7 batchfile可在选择第一个文件的子目录中进行迭代_Windows_Batch File - Fatal编程技术网

Windows 7 batchfile可在选择第一个文件的子目录中进行迭代

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 .. )

我正在运行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 ..
)`
我得到的只是命令的语法不正确


我已经尝试使用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个文件的新方法


你必须写一个数字来代替上面的
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"
   )
)