查找包含 1 个文件的文件夹的批处理文件

Batch file that looks for a folder that contains 1 file

我有很多文件夹,其中包含随机数量的文件。 而且其中大部分只有 1 个文件,这些文件需要移动到父文件夹。但我不知道我应该如何使用批处理文件。

我用的是Windows7 Ultimate

您有许多文件夹,其中可能包含也可能不包含文件,并且您想将所有文件移动到其他目录?

PowerShell 是使用批处理文件的新的和改进的超级收费版本,这就是您将要使用的方式。

  1. 运行 PowerShell
  2. 粘贴以下内容

    dir -Recurse C:\FolderContainingManySubfolder | ? PSI 容器 | dir -递归 |移动项目 -Destination T:\somePath -WhatIf

将 C:\FolderContainingManySubfolder 替换为包含所有其他文件夹的文件夹,每个文件夹包含一个或两个项目,并将 T:\somePath 替换为您希望单个文件所在的位置。

运行 它,你会看到很多 'What If' 输出,它告诉你如果你 运行 命令会发生什么。如果您对所看到的内容感到满意,请从末尾删除 -WhatIf 参数。

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /d /r "%sourcedir%" %%a IN (*) DO (
 FOR /f %%c IN ('dir /b/a-d "%%a\*.*" 2^>nul ^|find /c /v ""') DO IF %%c==1 ECHO(MOVE "%%a\*.*" "%%a\..\"
)

GOTO :EOF

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

for /d /r查找所有以sourcedir开头的子目录名称,依次将thenm分配给%%a

然后仅检查每个目录的文件名; 2>nul 抑制空目录的错误消息,并且 dir 命令的输出被馈送到 find,后者计算 (/c) 不存在的行数t 匹配 ""(即计算目录的行数 = # 返回的文件)。这适用于 %%c

如果 %%c 为 1,则将所有(一个)文件从目录移动到其父目录。

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

此解决方案不使用任何外部 .exe 命令,因此它应该 运行 更快。而且,很清楚,理解起来没有问题,我觉得...

@echo off
setlocal EnableDelayedExpansion

for /D %%d in (*) do (
   set "firstFile="
   set "moreThanOneFile="
   for %%f in ("%%d\*.*") do (
      if not defined firstFile (
         set "firstFile=%%f"
      ) else (
         set "moreThanOneFile=true"
      )
   )
   if not defined moreThanOneFile move "!firstFile!" "%%d"
)