在Windows 7(cmd或PowerShell)上压缩子文件夹中的文件

时间:2014-12-16 22:40:36

标签: powershell cmd robocopy

我有大量文件以非常分层的文件夹结构组织。在此结构中,我关心的文件始终位于文件夹的最低级别。因此,我想展平目录,以便更容易访问我关心的文件。但是,我想保留文件夹结构的2个更高级别(Person& Project)。

以下是 EXISTING 文件夹目录的示例:

  • 指南
    • 汤姆
      • 项目1
        • 子文件夹级别A.
          • FILEA
        • FILEB
      • 项目2
        • 子文件夹级别C.
          • FileC
        • 日提交
    • 杰里
      • 项目1
        • 子文件夹级别E.
          • FileE

以下是 DESIRED 文件夹目录的示例:

  • 指南
    • 汤姆
      • 项目1
        • FILEA
        • FILEB
      • 项目2
        • FileC
        • 日提交
    • 杰里
      • 项目1
        • FileE

我尝试过这样的事情,但这会将所有文件展平为一个目录:

for /r %f in (*) do @copy "%f" .

但是,这会产生:

  • 指南
    • FILEA
    • FILEB
    • FileC
    • 日提交
    • FileE

我很感激您提供的任何指导。非常感谢!

4 个答案:

答案 0 :(得分:2)

在那个有效的循环周围抛出几个额外的循环。

e.g。首先更改为名称文件夹,然后是项目文件夹,循环遍历两个级别。

for /D %n in (*) do (
    pushd %n
    for /D %p in (*) do (
        pushd %p
        for /r %f in (*) do @copy "%f" .
        popd
    )
    popd
)

如果将其放入bat文件中,请记住将%替换为%%

答案 1 :(得分:0)

这是一个Powershell方法。它获取所需级别的文件夹列表。然后它将所有子文件移动到该级别。它还会删除子文件夹。

$Rootfolder = Dir directory\*\* -Directory 

ForEach($folder in $Rootfolder)
{
    Dir $folder.fullname -Recurse -File | Copy-Item -Destination $folder.fullname
    Dir $folder.fullname -Recurse -Directory | Remove-Item -Force -Recurse -WhatIf
}

如果要删除它,请从最后一行删除-WhatIf。

答案 2 :(得分:0)

@echo off
pushd yourDirectory
for /d %%A in (*) do for /d %%B in ("%%A\*") do for /d %%C in ("%%B\*") do (
  pushd "%%C"
  for /r %%F in (*) do move /y "%%F" "%%B" >nul
  popd
  rd /q /s "%%C"
)
popd

%% A包含类似“yourDirectory \ Tom”的内容
%% B包含类似“yourDirectory \ Tom \ Project 1”的内容
%% C包含类似“yourDirectory \ Tom \ Project 1 \ subdirectory1”的内容 %% F包含要移动到任何深度的文件

起初我以为我可以消除PUSHD / POPD并使用

for /r "%%C" %%F in (*) do ...  THIS DOES NOT WORK

但是这不起作用 - / R之后的值不能使用FOR变量或延迟扩展,因为解析命令的方式。

答案 3 :(得分:0)

我调整了@ ScottC的回答并使用了以下代码:

for /D %%n in (*) do (
    pushd %%n
    for /D %%p in (*) do (
        pushd %%p
        for /r %%f in (*.ppt) do (
            move "%%f" "[ROOT_PATH_THAT_I_WANT]\%%n\%%p".
        )
        popd
    )
    popd
)

我将此解决方案作为.bat文件运行,这就是我使用%%而不是%。

的原因

%% n = name(又名C:\ Directory \ Name)
%% p =项目(又名C:\ Directory \ Name \ Project)
%% f =要移动的文件(递归浏览文件夹并将它们移动到项目级别)

最终,我无法得到@ dbenham关于删除空文件夹的建议,所以我最终使用了这个实用程序:http://www.jonasjohn.de/red.htm。到目前为止它似乎非常直观,并且在没有我太多努力的情况下就像是在处理问题:)

感谢大家的帮助!