【问题标题】:BATCH - for loop: Why only the last file is processed?BATCH - for 循环:为什么只处理最后一个文件?
【发布时间】:2011-12-18 14:55:13
【问题描述】:
@echo on

set src=c:\test
set dst=d:\test

xcopy %src% %dst%

for /F "TOKENS=*" %%G in ('dir/b ^%src%\*.*^') DO set new=%%G

attrib +h "%dst%\%new%"

del "%dst%"
attrib -h "%dst%\%new%"

pause

来源: 文件 1 文件2

目的地: 文件3

我唯一的问题是我不知道为什么在将属性 h 添加到文件的 for 循环中只读取 file2 。我希望 Source 文件夹下的所有文件都添加分配的属性。

我该如何解决这个问题?

【问题讨论】:

    标签: batch-file for-loop delete-file


    【解决方案1】:

    你得到你输入的内容:-)
    您只需删除 @echo off 即可调试批处理文件。

    您的循环处理所有文件,并设置new 变量,但attrib +h 和其余部分在循环之后执行,而不是在循环内部。

    我假设您想首先隐藏 src 文件夹中存在的所有文件,然后删除其余文件,然后取消隐藏所有文件。
    但是这个块不起作用,因为它隐藏一个文件删除所有其他文件,然后再次取消隐藏文件。

    attrib +h "%dst%\%new%"
    del "%dst%"
    attrib -h "%dst%\%new%"
    

    你可以试试这个,它会隐藏所有必要的文件,然后删除其他文件,并取消隐藏所有文件。

    @echo on
    
    set src=c:\test
    set dst=d:\test
    
    xcopy %src% %dst%
    setlocal EnableDelayedExpansion
    for /F "TOKENS=*" %%G in ('dir/b ^%src%\*.*^') DO (
      set "new=%%G"
    
      attrib +h "%dst%\!new!"
    )
    del "%dst%"
    attrib -h "%dst%\*.*"
    
    pause
    

    【讨论】:

    • »你得到你输入的内容«是一个不错的选择 - 在大多数情况下当人们为编程而苦恼时也是如此:-)
    • 还有一些bug:在FOR循环中设置变量new时必须去掉引号,并且需要延迟扩展。加SETLOCAL enabledelayedexpansion;并将循环中的指令更改为SET NEW=%%GATTRIB +h "%dst%\!new!"
    • 你说得对,我忘记了延迟扩展(就是我!)。但引号不是必需的,但对隐藏的 spaves 很有用
    • 是的,非常感谢。我注意到我是怎么弄错的。非常清晰的暗示解释。
    【解决方案2】:

    没有

    % 字符不能使用这个^ 必须使用%

    如果要输出字符%

    你必须写成%%

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多