找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31590|回复: 11

[文本处理] [已解决]批处理将当前目录下的指定文件夹移动到指定目录?

[复制链接]
发表于 2019-5-25 12:28:34 | 显示全部楼层 |阅读模式
本帖最后由 滴血雄鹰 于 2019-5-29 07:50 编辑

批处理将当前目录下的指定文件夹移动到指定目录?

E:\0000\1001(文件夹名)\...
...
E:\0000\1400(文件夹名)\...

E:\0000\2001(文件夹名)\...
...
E:\0000\2400(文件夹名)\...

以此类推

另外,E:\0000\下还有其他文件夹和文件。

只将符合条件的1001~1400文件夹及子文件移动到E:\0000\0\下,E:\0000\下还有其他文件夹和文件不处理,如何实现?
发表于 2019-5-25 15:13:07 | 显示全部楼层
本帖最后由 miqilaosu 于 2019-5-25 16:02 编辑

@echo off
title 复制
color 2f
cd /d %~dp0
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir /ad/b/s "*"') do (
set ni=%%~ni
set /a "ni=!ni:~0,4!"
if !ni! LEQ 1400 if !ni! GEQ 1000 (
xcopy /s /e /y "%%i" "F:\0000\0\%%~ni\"
)
)
pause
^^^^^^^^^^^^^^^^^^^^^^^^^
不知道你要的是不是这么复制
 楼主| 发表于 2019-5-25 16:35:08 | 显示全部楼层
本帖最后由 滴血雄鹰 于 2019-5-25 16:46 编辑

回复 2# miqilaosu

复制是对的,但我想要的的是移动,能不能修改下?另外,能不能加上个选项,就是可以输入移动指定的多少个文件夹,加上个输入窗口输入文件夹开始名称:1001,结束名称:1100,例如,我不是要全部移动1001~1400全部文件夹,而且可以选择只移动1001~1100文件夹,1101~1400不移动。
如果目标文件夹中已有移动的文件夹,停止执行,并提示后,按任意健退出。
发表于 2019-5-25 17:12:43 | 显示全部楼层
本帖最后由 miqilaosu 于 2019-5-25 18:41 编辑

@echo off
title 复制
color 2f
cd /d %~dp0
set /p ks=开始:
set /p js=结束:
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir /ad/b/s "*"') do (
set ni=%%~ni
set /a "ni=!ni:~0,4!"
if !ni! GEQ %ks% if !ni! LEQ %js% (
xcopy /s /e /d /y "%%i" "F:\0000\0\%%~ni\" && Rd /s /q "%%i"
)
)
pause
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最后你说的这个有就停止的没改。你确定是有就停止?而不是有就跳过继续执行?这个是不覆盖已存在文件,如果你想停止需要判断下直接跳出

评分

参与人数 1技术 +1 收起 理由
滴血雄鹰 + 1 就用这个代码了!

查看全部评分

发表于 2019-5-25 17:41:04 | 显示全部楼层
本帖最后由 miqilaosu 于 2019-5-25 18:43 编辑

@echo off
title 复制
color 2f
cd /d %~dp0
set /p ks=开始:
set /p js=结束:
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir /ad/b/s "*"') do (
set ni=%%~ni
set /a "ni=!ni:~0,4!"
if !ni! GEQ %ks% if !ni! LEQ %js% (
if exist "F:\0000\0\%%~ni\" (
echo,已存在按任意键跳出
pause
exit
) else (

xcopy /s /d /e /y "%%i" "F:\0000\0\%%~ni\" && Rd /s /q "%%i")

)
)
)
pause
……………………………………………………………………………………………………………………
这个是你说的存在停止跳出的那个,但这种复制的文件估计不会完整啊,因为有可能你100个文件复制第二个时就有相同的了,然后跳出后面都不会执行啊
 楼主| 发表于 2019-5-26 07:46:42 | 显示全部楼层
本帖最后由 滴血雄鹰 于 2019-5-26 07:49 编辑

回复 5# miqilaosu


    5楼代码实际效果与4楼代码效果完全一样。不管有没有存在文件,都是复制。在4楼的基础上,能否在执行文件复制前,先检测下E:\0000\0文件夹情况,
有3种情况:
一种情况:
E:\0000\下没有0文件夹。
第2种情况:
E:\0000\存在0文件夹,是空文件夹
第3种情况:
E:\0000\存在0文件夹,不是空文件夹,而是存在子文件夹及文件。

如果是第3种情况,就提示下:"E:\0000\0\存在文件",按任意键退出,中断下面的执行复制任务。如果不是第3种情况,就执行复制。
发表于 2019-5-26 12:08:11 | 显示全部楼层
本帖最后由 miqilaosu 于 2019-5-26 12:11 编辑

回复 6# 滴血雄鹰


@echo off
title 复制
color 2f
cd /d %~dp0
set /p ks=开始:
set /p js=结束:
setlocal enabledelayedexpansion
for /f "delims=*" %%i in ('dir /ad/b/s "*"') do (
set ni=%%~ni
set /a "ni=!ni:~0,4!"
        if !ni! GEQ %ks% if !ni! LEQ %js% (
                if exist "E:\0000\0\%%~ni\" (
                                dir /ad/b/s "E:\0000\0\%%~ni\" | findstr .*>nul && (
                                echo “文件为空正在复制”
                                xcopy /s /d /e /y "%%i" "E:\0000\0\%%~ni\" && Rd /s /q "%%i"
                                ) || (
                                echo “文件已存在”
                                pause
                                exit
                                )
                )  else (
                xcopy /s /d /e /y "%%i" "E:\0000\0\%%~ni\" && Rd /s /q "%%i"
                )
        ) else (
        echo "没有符合文件"
        )
)
pause
…………………………………………………………………………………………………………………………………………………………………………………………
我试过了这种比如有三个文件夹:1001文件夹,1005文件夹,1008文件夹。比如1005文件夹以E:\000\0\存在文件的话 1008是没有被执行的,因为我也是新人,希望有专业人事帮解答
 楼主| 发表于 2019-5-27 20:27:56 | 显示全部楼层
回复 7# miqilaosu

那这样,E:\0000\下存在0文件夹,不管是空的还是0文件夹下有文件,都提示下:"有0文件夹存在",按任意键退出,中断下面的执行复制任务。否则,就执行复制。这种方式能实现么?
发表于 2019-5-27 22:30:18 | 显示全部楼层
PowerShell 3.0+

  1. $list=ls "E:\0000" -dir|?{$_.name -match '^[\d]*$'};

  2. Function Get-InputNum {
  3.         write-host "文件夹序号范围:$($list[0]) - $($list[-1])" -fore Red;'';
  4.         Write-Host '输入序号:用【.,*-+/\=或空格】等分开' -fore Yellow;
  5.         $enter = $null;
  6.         $enter = Read-Host -Prompt "输入要移动的文件夹序号";
  7.         if ( !$enter ) {
  8.                 cls;Write-Host '输入数字范围' -fore red; Get-InputNum;
  9.         } else { Return $enter }
  10. }

  11. $enter = ((Get-InputNum) -join '').Trim();
  12. $ref = $enter -split '\.|,|-|\*|\+|=|/|\\|\s+';
  13. Try {
  14.         $n1 = $ref[0].Trim() -as [int];
  15.         $n2 = $ref[1].Trim() -as [int];
  16. } catch {
  17.         cls; '文件错误,检查后重新运行,按任意键退出'; Pause; exit;
  18. }
  19. $num = @( ($n1..$n2)|%{$_} );
  20. $folder = @(ls "E:\0000" -dir|?{$_.name -in $num});
  21. Foreach ( $d in $folder )
  22. {
  23.         if ( [io.directory]::Exists("E:\0000\0\$d") ) {
  24.                 Write-Host "已存在 $d 跳过移动";
  25.                 Continue;
  26.         };
  27.         move "E:\0000\$d" -dest "E:\0000\0" -verb -Force;
  28. }

  29. Pause;
复制代码

评分

参与人数 1技术 +1 收起 理由
miqilaosu + 1 感谢分享

查看全部评分

发表于 2019-5-28 14:55:53 | 显示全部楼层
本帖最后由 xczxczxcz 于 2019-5-28 15:23 编辑

其实我上面的脚本有 5 个问题:
一、 TRY{} 内两个赋值语句 没有错误返回值。不会抛异常。
二、 当用户输入一组数字时 没有做异常处理。
三、 $num 赋值有些画蛇添足。 直接 n1..n2 即可。
四、 当n1 大于 n2 时。系统会直接从 n1 截断以 n1为最小值。 所以要加 sort. 或者修改 -in 参数。
五、函数中用了 ''' ,这个空行并不会在控制台显示,而是被返回值吃掉了。

把修改好的再发上来。KAO. 我好象没这么严谨的发过脚本。 powershell 3.0+ 这个可以随意使用了。

  1. $list=ls "$pwd\0000" -dir|?{$_.name -match '^[\d]*$'};

  2. Function Get-InputNum {
  3.         write-host "文件夹序号范围:$($list[0]) - $($list[-1])`n" -fore Green;
  4.         Write-Host "输入序号:用【.,*-+/\=或空格】等分开`n" -fore Yellow;
  5.         $ref = $enter = $null;
  6.         $enter = Read-Host -Prompt "输入要移动的文件夹序号范围";

  7.         if ( !$enter ) {
  8.                 cls;Write-Host '输入数字范围' -fore red; Get-InputNum;
  9.         }

  10.         $ref = (-join $enter).Trim() -split '\.|,|-|\*|\+|=|/|\\|\s+';
  11.         if ( $ref.count -eq 1 ) {
  12.                 Try {
  13.                         $n2 = $n1 = [int]$ref.Trim();
  14.                 } catch {
  15.                         cls;
  16.                         Write-Host "文件错误,重新输入`n" -fore red;
  17.                         Get-InputNum;
  18.                 }
  19.                 Return $n1,$n2;
  20.         }

  21.         Try {
  22.                 $n1 = [int]$ref[0].Trim();
  23.                 $n2 = [int]$ref[1].Trim();
  24.         } catch {
  25.                 cls;
  26.                 Write-Host "文件错误,重新输入`n" -fore red;
  27.                 Get-InputNum;
  28.         }
  29.         Return $n1,$n2;
  30. }

  31. $enter = Get-InputNum;
  32. Clear-Host;
  33. $num = $enter[0]..$enter[1] | sort;
  34. $folder = @(ls "$pwd\0000" -dir|?{$_.name -in $num});
  35. Foreach ( $d in $folder )
  36. {
  37.         if ( [io.directory]::Exists("$pwd\0000\0\$d") ) {
  38.                 Write-Host "已存在 $d 跳过移动";
  39.                 Continue;
  40.         };
  41.         move "$pwd\0000\$d" -dest "$pwd\0000\0" -verb -WhatIf;
  42. }

  43. Pause;
复制代码
 楼主| 发表于 2019-5-29 07:44:49 | 显示全部楼层
本帖最后由 滴血雄鹰 于 2019-5-29 07:52 编辑

回复 4# miqilaosu


我就用这个代码了,powershell 3.0搞不来,Win7默认不支持,麻烦。
发表于 2019-5-29 11:28:17 | 显示全部楼层
回复 11# 滴血雄鹰


    Win7马上停止支持啦,尽快升级到Win10吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 05:13 , Processed in 0.019947 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表