【问题标题】:Iterating over all folders and moving up a subfolder if a condition is met如果满足条件,则遍历所有文件夹并向上移动子文件夹
【发布时间】:2016-01-11 19:02:27
【问题描述】:

我想制作一个脚本来迭代当前文件夹中的所有文件夹,然后如果一个文件夹(我们迭代的)只有一个文件或目录,则将该文件或目录上移一级。 (如果可能的话,删除现在空的文件夹)

这是我目前得到的:

for /d %s in (.\*) do (
@echo %s

set cnt=0
for %A in (%s) do set /a cnt+=1
echo File count = %cnt%

@echo %cnt //don't do anything
@echo %a   //don't do anything

if (cnt leq 1) (
move .\*.* ..
)
)

但它不起作用,我不知道为什么......

我的代码来自:

计数脚本来自:https://stackoverflow.com/a/11005300/4279201

遍历当前目录的子目录:Iterate all files in a directory using a 'for' loop

移动:https://superuser.com/a/180578/451485

【问题讨论】:

    标签: windows batch-file syntax scripting


    【解决方案1】:
    @ECHO OFF
    SETLOCAL
    SET "sourcedir=U:\sourcedir"
    :: First, create a list of subdirectorynames; iterate using `%%a`
    FOR /f "delims=" %%a IN (
      'dir /b /ad "%sourcedir%\*" '
      ) DO (
     REM clear initial flags for each dir
     SET "flag1="
     SET "flag2="
     REM Now read the subdirectory. set flag1 for first file, flag2 for second or later
     FOR /f %%g IN (
      'dir /b /a-d "%sourcedir%\%%a\*" 2^>nul'
      ) DO IF DEFINED flag1 (SET flag2=y) ELSE (SET flag1=y)
     REM if neither flag set, directory is empty
     REM if both are set, dir has 2 or more files
     REM so - if flag1 but not flag2 is set then exactly 1 file.
     IF DEFINED flag1 IF NOT DEFINED flag2 ECHO(MOVE "%sourcedir%\%%a\*" "%sourcedir%\"
     REM if flag2 is not set, subdirectory is now empty
     IF NOT DEFINED flag2 ECHO(rd "%sourcedir%\%%a"
    )
    
    GOTO :EOF
    

    您需要更改sourcedir 的设置以适应您的情况。

    所需的 MOVE 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(MOVE 更改为MOVE 以实际移动文件。附加>nul 以禁止报告消息(例如1 file moved

    所需的 RD 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(RD更改为RD以实际创建目录。

    我建议您将批处理定位在包含三个子目录的树上,其中包含 0,1 和 2 个用于测试的文件。

    由于多种原因,您的批次失败。

    1. 批处理文件中的元变量(循环控制变量)在每个引用中都需要 double %
    2. 环境变量由%var% 引用,而不是%var
    3. 在一个块语句(括号内的一系列语句)中,%var% 将引用var 的值在最初遇到块时,而不是随着变量在环形。这是delayed expansion 问题 - 此处有详细记录。

    请注意,此批处理不会检查目标目录中是否已存在要移动的候选对象。如果是这样,那么moverd 语句将生成错误报告,并且文件和目录将保持原样。

    注意:不要将任何rem 行更改为:: 表单,因为:: 实际上是终止块的损坏标签(即会导致问题)


    编辑 - 修订

    @ECHO Off
    SETLOCAL
    SET "sourcedir=U:\sourcedir"
    :: First, create a list of subdirectorynames; iterate using `%%a`
    FOR /f "delims=" %%a IN (
      'dir /b /ad "%sourcedir%\*" '
      ) DO (
     REM clear initial flags for each dir
     ECHO %%a
     SET "subdir=%%a"
     SET "flag1="
     SET "flag2="
     REM Now read the subdirectory. set flag1 for first file, flag2 for second or later
     FOR /f "delims=" %%g IN (
      'dir /b "%sourcedir%\%%a\*" 2^>nul'
      ) DO SET "name=%%g"&IF DEFINED flag1 (SET flag2=y) ELSE (SET flag1=y)
     REM if neither flag set, directory is empty
     REM if both are set, dir has 2 or more files/dirs
     REM so - if flag1 but not flag2 is set then exactly 1 file/dir
     IF DEFINED flag1 IF NOT DEFINED flag2 CALL :moveit
     REM if flag2 is not set, subdirectory is now empty
     IF NOT DEFINED flag2 rd "%sourcedir%\%%a"
    )
    
    GOTO :EOF
    :moveit
    REM NAME may be a file or a directory - "%sourcedir%\%%a\%NAME%\.." exists if directory
    IF NOT EXIST "%sourcedir%\%subdir%\%NAME%\.." MOVE "%sourcedir%\%subdir%\*" "%sourcedir%\"
    IF EXIST "%sourcedir%\%subdir%\%NAME%\.." IF NOT EXIST "%sourcedir%\%name%" MOVE "%sourcedir%\%subdir%\%NAME%" "%sourcedir%\"
    GOTO :EOF
    

    小心!上述批次 NOT 使用 ECHO( 因此它将尝试
    移动或删除文件或目录。仅在测试子树上使用!

    此次要修订将单个目录以及单个文件向上移动到目标下方级别的目录中。

    如果无法按指示移动或删除,它会显示足够的信息来推断错误消息的来源。

    本质上,它与原来的相同,只是调用了一个子例程来进行更改。该子例程使用name 作为它希望移动的目录名,使用subdir 作为正在处理的子目录。

    【讨论】:

    • 我将U:\sourcedir 更改为%~dp0%cd%,甚至更改为c:\a,并在那里创建了一个包含一些测试的文件夹,但它们并没有做他们应该做的事情。 ..
    • 很遗憾,我看不到你的屏幕,所以你必须明确说明它做了什么。我无法理解您对批次的预期效果。
    • 这是一个解决该问题的 gif:i.imgur.com/TDZznfF.gif new folder 有一个文件,它不会移动到 c:\a,也不会移动到 new folder 2 的单个文件夹 asdf
    • 尝试在goto :eof 之前插入PAUSE 行。这将显示结果。通过使用点击和傻笑运行,批处理会在终止时关闭,而不会让您有机会查看结果。
    • 哦,是的,现在我看到了命令,我应该知道使用它,无论如何,我删除了echo(*,正如你所说,它适用于子文件夹中的单个文件,但它不从子文件夹中移动单个文件夹,即:i.imgur.com/SYdOf8k.gif 它不会将文件夹 asdf 移回其 c:\a
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 2021-11-26
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多