Robocopy Windows 11如何在目标文件夹内移动目标文件夹

eaf3rand  于 2023-05-19  发布在  Windows
关注(0)|答案(1)|浏览(351)

我正在尝试移动多个“标记”文件夹在一个目录内的副本文件夹(可能已存在,也可能不存在)。Robocopy未在目标文件夹中移动目标文件夹
这就是我尝试的

SetLocal EnableDelayedExpansion
for /F "delims=" %%a in ('dir /b *P') do (
 set "Name=%%a"
 set "Folder=!Name:~0,6!"
 robocopy /MOVE /E "%%a" !Folder!\ 
)
cmd /k

此代码在Windows 10中运行良好,但在Windows 11中,它删除了“标记(*P)”文件夹,而没有将其移动到目标文件夹(共享相同的前6位数字)中,无论该文件夹是否已经存在
我尝试搜索robocopy的win10和win 11版本之间的变更日志,以查看MOVE命令或任何其他参数是否有更改
我也试过改变代码的不同部分(甚至在某个时候创建了名为文件夹的空白空间),看看代码的任何其他部分是否在win10和win 11之间发生了变化,但仍然怀疑它的robocopy,因为在一个测试目录中,只有“33333 P”存在,里面有一个空文本文件,我运行.bat,一个新的“333333”文件夹出现了(里面有文件,基本上只是文件夹的重命名,这只是撤消了我的“标记”它),当在win10中它将“33333 P”移动到“333333”中时(按预期工作)
15/5/2023更多信息:我使用的是一个文件夹和文件的“数据库”,这些文件夹的编号从“10000”开始到大约“186000”(现在)。我想把所有的文件夹都移到同一个编号的文件夹里,但用一个P(过去)标记,以便区分我正在处理的东西和以前处理过的东西。我首先开始手动操作,但很快意识到它实际上是多么庞大,所以我重新利用了一个简单的重命名脚本,并开始研究如何将所需的项目大规模地移动到多个文件夹中。我第一次尝试使用“xcopy”,但它并没有像预期的那样工作,然后在互联网上搜索,我找到了robocopy,并编写了最初的一批。
该批处理在我家里的计算机上运行良好,在一个测试目录中有大约10个文件夹(Windows 10),将所有标记的文件夹及其内容(包括用于存档目的的空目录)移动到一个新创建的文件夹中。例:出所有的文件夹,我重命名为“3”,“5”,“11”到“3 P”,“5 P”,“11 P”,并希望批移动那些在一个新的文件夹创建相同的ID(所以一个新的“3”,“5”,“11”文件夹创建,和里面是“3 P”,“5 P”,“11 P”分别与所有的文件和目录它)
当我在工作时在我的计算机中重写批处理时,在我制作的另一个测试目录中,批处理不再像在家里那样工作。首先,我怀疑文件夹所有权和管理员权限,但我有他们在我的工作电脑太。那时我开始怀疑robocopy从win10到win 11的变化,但没有发现任何文档或更改日志,所以我甚至不确定是否是这样

6jjcrrmo

6jjcrrmo1#

该任务可以通过以下命令行使用批处理文件完成:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%I in ('dir "* P" /AD-L /B 2^>nul') do for /F %%J in ("%%I") do %SystemRoot%\System32\robocopy.exe "%%I" "%%J\%%I" /E /MOVE /NDL /NFL /NJH /NJS /R:0 >nul
endlocal

示例:
目录C:\Temp包含以下目录和文件:

  • 三个人
    *3个P
    *子文件夹1
  • 文件1.txt
  • 文件2.txt
    *3个P
    *子文件夹1
  • 文件1.txt
  • 文件3.txt
    *子文件夹2
  • 文件4.txt
  • 文件2.txt
    *5 P
    *子文件夹为空
    *子文件夹3
  • 文件6.txt
  • 文件5.txt
  • 第11章
    *子文件夹4
  • 文件7.txt
    *11个P
  • 文件8.txt
  • 文件9.txt
  • MoveFolders.cmd

执行MoveFolders.cmd,当前目录为C:\Temp
C:\Temp的结果是:

  • 三个人
    *3个P
    *子文件夹1
  • 文件1.txt
  • 文件3.txt
    *子文件夹2
  • 文件4.txt
  • 文件2.txt
    *3个P
    *子文件夹1
  • 文件1.txt
  • 文件2.txt
  • 五楼
    *5 P
    *子文件夹为空
    *子文件夹3
  • 文件6.txt
  • 文件5.txt
  • 第11章
    *11个P
  • 文件8.txt
  • 文件9.txt
    *子文件夹4
  • 文件7.txt
  • MoveFolders.cmd
    ROBOCOPY没有移动C:\Temp\3 P\Subfolder 1\File 1.txtC:\Temp\3 P\File 2.txt,因为目标目录已经包含这两个文件。目录C:\Temp\3 PC:\Temp\3 P\Subfolder 1不会因此而删除。

此增强代码删除目标目录中已存在的文件和目录。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%I in ('dir "* P" /AD-L /B 2^>nul') do for /F %%J in ("%%I") do (
    %SystemRoot%\System32\robocopy.exe "%%I" "%%J\%%I" /E /MOVE /NDL /NFL /NJH /NJS /R:0 >nul
    if not errorlevel 2 if exist "%%I\" rd /Q /S "%%I"
)
endlocal

C:\Temp中的结果现在是:

  • 三个人
    *3个P
    *子文件夹1
  • 文件1.txt
  • 文件3.txt
    *子文件夹2
  • 文件4.txt
  • 文件2.txt
  • 五楼
    *5 P
    *子文件夹为空
    *子文件夹3
  • 文件6.txt
  • 文件5.txt
  • 第11章
    *11个P
  • 文件8.txt
  • 文件9.txt
    *子文件夹4
  • 文件7.txt
  • MoveFolders.cmd

建议在运行批处理文件时,要移动的目录都不是任何正在运行的进程的当前目录,并且要移动的文件都不是由正在运行的应用程序打开的,因为在这种情况下,ROBOCOPY将无法移动这些文件和文件夹。
要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并仔细阅读显示的每个命令的帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rd /?
  • robocopy /?
  • setlocal /?

另外还应阅读ROBOCOPY.exeROBOCOPY Exit Codes的SS64文档。

相关问题