标题: [文本处理] [已解决]批处理将当前目录下的指定文件夹移动到指定目录? [打印本页]
作者: 滴血雄鹰 时间: 2019-5-25 12:28 标题: [已解决]批处理将当前目录下的指定文件夹移动到指定目录?
本帖最后由 滴血雄鹰 于 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\下还有其他文件夹和文件不处理,如何实现?
作者: miqilaosu 时间: 2019-5-25 15:13
本帖最后由 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
本帖最后由 滴血雄鹰 于 2019-5-25 16:46 编辑
回复 2# miqilaosu
复制是对的,但我想要的的是移动,能不能修改下?另外,能不能加上个选项,就是可以输入移动指定的多少个文件夹,加上个输入窗口输入文件夹开始名称:1001,结束名称:1100,例如,我不是要全部移动1001~1400全部文件夹,而且可以选择只移动1001~1100文件夹,1101~1400不移动。
如果目标文件夹中已有移动的文件夹,停止执行,并提示后,按任意健退出。
作者: miqilaosu 时间: 2019-5-25 17:12
本帖最后由 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最后你说的这个有就停止的没改。你确定是有就停止?而不是有就跳过继续执行?这个是不覆盖已存在文件,如果你想停止需要判断下直接跳出
作者: miqilaosu 时间: 2019-5-25 17:41
本帖最后由 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
本帖最后由 滴血雄鹰 于 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种情况,就执行复制。
作者: miqilaosu 时间: 2019-5-26 12:08
本帖最后由 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
回复 7# miqilaosu
那这样,E:\0000\下存在0文件夹,不管是空的还是0文件夹下有文件,都提示下:"有0文件夹存在",按任意键退出,中断下面的执行复制任务。否则,就执行复制。这种方式能实现么?
作者: xczxczxcz 时间: 2019-5-27 22:30
PowerShell 3.0+- $list=ls "E:\0000\" -dir|?{$_.name -match '^[\d]*$'};
-
- Function Get-InputNum {
- write-host "文件夹序号范围:$($list[0]) - $($list[-1])" -fore Red;'';
- Write-Host '输入序号:用【.,*-+/\=或空格】等分开' -fore Yellow;
- $enter = $null;
- $enter = Read-Host -Prompt "输入要移动的文件夹序号";
- if ( !$enter ) {
- cls;Write-Host '输入数字范围' -fore red; Get-InputNum;
- } else { Return $enter }
- }
-
- $enter = ((Get-InputNum) -join '').Trim();
- $ref = $enter -split '\.|,|-|\*|\+|=|/|\\|\s+';
- Try {
- $n1 = $ref[0].Trim() -as [int];
- $n2 = $ref[1].Trim() -as [int];
- } catch {
- cls; '文件错误,检查后重新运行,按任意键退出'; Pause; exit;
- }
- $num = @( ($n1..$n2)|%{$_} );
- $folder = @(ls "E:\0000\" -dir|?{$_.name -in $num});
- Foreach ( $d in $folder )
- {
- if ( [io.directory]::Exists("E:\0000\0\$d") ) {
- Write-Host "已存在 $d 跳过移动";
- Continue;
- };
- move "E:\0000\$d" -dest "E:\0000\0\" -verb -Force;
- }
-
- Pause;
复制代码
作者: xczxczxcz 时间: 2019-5-28 14:55
本帖最后由 xczxczxcz 于 2019-5-28 15:23 编辑
其实我上面的脚本有 5 个问题:
一、 TRY{} 内两个赋值语句 没有错误返回值。不会抛异常。
二、 当用户输入一组数字时 没有做异常处理。
三、 $num 赋值有些画蛇添足。 直接 n1..n2 即可。
四、 当n1 大于 n2 时。系统会直接从 n1 截断以 n1为最小值。 所以要加 sort. 或者修改 -in 参数。
五、函数中用了 ''' ,这个空行并不会在控制台显示,而是被返回值吃掉了。
把修改好的再发上来。KAO. 我好象没这么严谨的发过脚本。 powershell 3.0+ 这个可以随意使用了。- $list=ls "$pwd\0000\" -dir|?{$_.name -match '^[\d]*$'};
-
- Function Get-InputNum {
- write-host "文件夹序号范围:$($list[0]) - $($list[-1])`n" -fore Green;
- Write-Host "输入序号:用【.,*-+/\=或空格】等分开`n" -fore Yellow;
- $ref = $enter = $null;
- $enter = Read-Host -Prompt "输入要移动的文件夹序号范围";
-
- if ( !$enter ) {
- cls;Write-Host '输入数字范围' -fore red; Get-InputNum;
- }
-
- $ref = (-join $enter).Trim() -split '\.|,|-|\*|\+|=|/|\\|\s+';
- if ( $ref.count -eq 1 ) {
- Try {
- $n2 = $n1 = [int]$ref.Trim();
- } catch {
- cls;
- Write-Host "文件错误,重新输入`n" -fore red;
- Get-InputNum;
- }
- Return $n1,$n2;
- }
-
- Try {
- $n1 = [int]$ref[0].Trim();
- $n2 = [int]$ref[1].Trim();
- } catch {
- cls;
- Write-Host "文件错误,重新输入`n" -fore red;
- Get-InputNum;
- }
- Return $n1,$n2;
- }
-
- $enter = Get-InputNum;
- Clear-Host;
- $num = $enter[0]..$enter[1] | sort;
- $folder = @(ls "$pwd\0000\" -dir|?{$_.name -in $num});
- Foreach ( $d in $folder )
- {
- if ( [io.directory]::Exists("$pwd\0000\0\$d") ) {
- Write-Host "已存在 $d 跳过移动";
- Continue;
- };
- move "$pwd\0000\$d" -dest "$pwd\0000\0\" -verb -WhatIf;
- }
-
- Pause;
复制代码
作者: 滴血雄鹰 时间: 2019-5-29 07:44
本帖最后由 滴血雄鹰 于 2019-5-29 07:52 编辑
回复 4# miqilaosu
我就用这个代码了,powershell 3.0搞不来,Win7默认不支持,麻烦。
作者: Batcher 时间: 2019-5-29 11:28
回复 11# 滴血雄鹰
Win7马上停止支持啦,尽快升级到Win10吧
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |