[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 滴血雄鹰 于 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\下还有其他文件夹和文件不处理,如何实现?

回复 11# 滴血雄鹰


    Win7马上停止支持啦,尽快升级到Win10吧
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 滴血雄鹰 于 2019-5-29 07:52 编辑

回复 4# miqilaosu


我就用这个代码了,powershell 3.0搞不来,Win7默认不支持,麻烦。

TOP

本帖最后由 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;
复制代码

TOP

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

评分人数

TOP

回复 7# miqilaosu

那这样,E:\0000\下存在0文件夹,不管是空的还是0文件夹下有文件,都提示下:"有0文件夹存在",按任意键退出,中断下面的执行复制任务。否则,就执行复制。这种方式能实现么?

TOP

本帖最后由 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是没有被执行的,因为我也是新人,希望有专业人事帮解答

TOP

本帖最后由 滴血雄鹰 于 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种情况,就执行复制。

TOP

本帖最后由 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个文件复制第二个时就有相同的了,然后跳出后面都不会执行啊

TOP

本帖最后由 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

评分人数

TOP

本帖最后由 滴血雄鹰 于 2019-5-25 16:46 编辑

回复 2# miqilaosu

复制是对的,但我想要的的是移动,能不能修改下?另外,能不能加上个选项,就是可以输入移动指定的多少个文件夹,加上个输入窗口输入文件夹开始名称:1001,结束名称:1100,例如,我不是要全部移动1001~1400全部文件夹,而且可以选择只移动1001~1100文件夹,1101~1400不移动。
如果目标文件夹中已有移动的文件夹,停止执行,并提示后,按任意健退出。

TOP

本帖最后由 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
^^^^^^^^^^^^^^^^^^^^^^^^^
不知道你要的是不是这么复制

TOP

返回列表