【问题标题】:Win7 Batch File - Moving Subfolders(& Files) to Grand-Parent DirectoryWin 7 批处理文件 - 将子文件夹(和文件)移动到祖父目录
【发布时间】:2015-06-16 21:21:03
【问题描述】:

我有一个有点复杂的问题。我已经使用 Httrack 从 archive.org 下载了一个存档网站,现在我需要合并数千个子文件夹和文件,然后才能重建它。

我正在尝试编写一个批处理文件来解决问题。但我的搜索结果从未接近我想要实现的目标。

我正在尝试制作这些:

D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110202194232\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110202194331im_\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110202194449cs_\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110202194453im_\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110202194505cs_\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110101000000_\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110101072153\http_\www.site.com\*
D:\Utilities\httrack\SITES\RW\web.archive.org\web\20110201061410\http_\www.site.com\*

进入这个:

D:\Utilities\httrack\SITES\RW\web.archive.org\web\http_\www.site.com\*

基本上试图将“http_”移动到其祖父目录(“web”)中,其中包含子文件夹和文件。就像我在拖放一样,单击“是”以合并文件夹,然后单击“移动,但保留两个文件”。

我还希望它重命名任何具有相同名称的文件以避免删除。

IE:

web\http_\www.site.com\index.html
web\http_\www.site.com\index (1).html
web\http_\www.site.com\index (2).html

提前感谢您的帮助!!!

【问题讨论】:

  • 如果我在下面的回答有帮助,请考虑将其标记为已接受。 See this page 解释为什么这很重要。此外,对于未来的问题,我们通常希望提问者发布示例代码,或者至少解释已经尝试过的内容 - 只是表明您自己解决问题所付出的努力。我们不是代码编写服务,并且通常不提供最终解决方案(除非在这种情况下,挑战有点有趣)。我们更喜欢教学和帮助,而不是“为我编写这段代码”。
  • @rojo 抱歉,我并没有试图将编码工作交给你。我认为解决方案将是一些简单的命令。我对这个问题做了很多研究,发现很少有相关的结果,但在这里很难证明这一点。我不想尝试我一无所知的批处理命令。我对 CMD/Batch/Powershell 的了解对于这样的努力来说是非常不足的。感谢您的解决方案和建议!

标签: batch-file cmd merge move subdirectory


【解决方案1】:

挑战:接受。如果将此功能内置到robocopyxcopyfso.CopyFile、PowerShell 的Move-Item 或任何其他实用程序或脚本对象方法中不是很好吗?

您可能应该在层次结构的副本上对此进行测试。我做了一些最小的测试,它似乎按预期工作,但如果出现不可预见的问题,它将是破坏性的。

@echo off
setlocal

set "root=D:\Utilities\httrack\SITES\RW\web.archive.org\web\"

for /d %%I in ("%root%\2*") do (
    set /P "=Moving %%~nxI... "<NUL
    pushd "%%~fI"
    for /r %%J in (*) do (
        set "relative=%%~dpJ"
        setlocal enabledelayedexpansion
        call :mv "%%~fJ" "%root%!relative:%%~fI\=!"
        endlocal
    )
    popd
    rd /q /s "%%~fI"
    echo Complete.
)

goto :EOF

:mv <srcfile> <destdir>
setlocal disabledelayedexpansion
if not exist "%~f2" md "%~f2"
set /a seq = 1
set "filename=%~nx1"
:mv_loop
if exist "%~f2\%filename%" (
    set "filename=%~n1 (%seq%)%~x1"
    set /a seq += 1
    goto mv_loop
)
move "%~f1" "%~f2\%filename%" >NUL
endlocal & goto :EOF

【讨论】:

  • 非常感谢您的辛勤工作!这非常有帮助。这将使我和其他人在未来受益!我简直不敢相信它有多复杂。我最近的测试揭示了 2 个非常小的问题。它将文件夹命名为“webhttp_”,而不仅仅是“http_”。也将它放在“web”文件夹上方。 "D:\Utilities\httrack\SITES\RW\web.archive.org\webhttp_" 应该是 "D:\Utilities\httrack\SITES\RW\web.archive.org\web\http_" 。非常小的故障,如果不容易修复,请不要担心。它仍然解决了我的问题,非常感谢您抽出宝贵的时间!
  • DERP。我的错。在我的测试期间,当我将“root=D:\Utilities\httrack\SITES\RW\web.archive.org\web\”更改为“root=D:\TEST\httrack\SITES\RW\web.archive.org \web" 我在末尾省略了 "\" 反斜杠.......这就是为什么我不应该尝试制作批处理文件的原因.lol.. 无论如何我只是再次测试了它(使用 "\") ,而且效果很好。你做得很好。我从中学到了很多。再次感谢楼主!
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2016-05-03
  • 2013-04-21
  • 2021-10-19
相关资源
最近更新 更多