查找包含 1 个文件的文件夹的批处理文件
Batch file that looks for a folder that contains 1 file
我有很多文件夹,其中包含随机数量的文件。
而且其中大部分只有 1 个文件,这些文件需要移动到父文件夹。但我不知道我应该如何使用批处理文件。
我用的是Windows7 Ultimate
您有许多文件夹,其中可能包含也可能不包含文件,并且您想将所有文件移动到其他目录?
PowerShell 是使用批处理文件的新的和改进的超级收费版本,这就是您将要使用的方式。
- 运行 PowerShell
粘贴以下内容
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 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将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"
)
我有很多文件夹,其中包含随机数量的文件。 而且其中大部分只有 1 个文件,这些文件需要移动到父文件夹。但我不知道我应该如何使用批处理文件。
我用的是Windows7 Ultimate
您有许多文件夹,其中可能包含也可能不包含文件,并且您想将所有文件移动到其他目录?
PowerShell 是使用批处理文件的新的和改进的超级收费版本,这就是您将要使用的方式。
- 运行 PowerShell
粘贴以下内容
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 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将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"
)