微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批处理如何避免相同的第二个 FOR 循环?

如何解决批处理如何避免相同的第二个 FOR 循环?

我创建了一个批处理脚本来备份一些子文件夹从路径 A 到路径 B (Z:\Folder1\… > U:\Backup\…)。

脚本列出​​路径 A 内的子文件夹,并为每个子文件增加一个数字。 然后,我只需要输入我要备份的子文件夹的编号,其余的由 xcopy 完成。

问题是有时我在路径 A 中有数千个子文件夹,而只有几个要备份(10 或 15)。

我想要的是,一旦我输入了这些文件夹的数量,它将直接进入备份,而不必再次循环路径 A 中的所有子文件夹(这需要时间)。

这是我的批次:

@echo off

setlocal EnableDelayedExpansion

rem Script for backuping some subfolders from path A to path B

set BackupLocation=U:\Backup
set subfolder_no=1

FOR /F "delims=" %%a IN ('dir /b "Z:\Folder1\*"') DO ( 

    set subfolder=%%a

    if defined subfolder (
        echo !subfolder_no! !subfolder!
        set /a subfolder_no+=1
        
    )
    
)
    
set /a subfolder_no=%subfolder_no%-1
set /a index=0
set /a choice=-1

echo.
set /p choice=Enter the number(s) of the subfolder(s) you want to backup: 

FOR /F "delims=" %%a IN ('dir /b "Z:\Folder1\*"') DO ( 

    set subfolder=%%a

    if defined subfolder (
        set /a index+=1
    )

FOR %%f IN (%choice%) DO if %%f==!index! (

echo.
echo Backuping subfolder !subfolder!

xcopy "Z:\Folder1\!subfolder!" "%BackupLocation%\!subfolder!\" /e /i /y

)
)

echo.
pause

exit

我该怎么做?是否可以从匹配的编号中获取文件夹的名称并将它们存储在变量或其他内容中?

非常感谢您的帮助!

解决方法

这是一个仅枚举一次目录的示例。

请注意,虽然它在技术上回答了您的问题并执行了您要求的任务,但此版本旨在按预期在 Windows 10 上运行。您询问的特定部分也适用于其他版本,但 {{ 1}} 标记部分使用 :BackUp 命令的新的和未记录的 Windows 10 功能,仅返回选择列表中的唯一项。否则,您的最终用户可能会多次提供相同的数字,从而触发同一目录的多次备份。 由于这部​​分代码在技术上超出了您的问题范围,如果您在较旧的操作系统上部署它,我将让您自行修改代码部分。

sort

@Echo Off SetLocal EnableExtensions DisableDelayedExpansion Rem Script for backing up some subdirectories of a Source path to a Backup path. Set "SourceLocation=Z:\Folder1" Set "BackupLocation=U:\Backup" If Not Exist "%Sourcelocation%\." Exit /B If Not Exist "%Backuplocation%\." Exit /B :ShowSet For /F "Delims==" %%G In ('"(Set subdirectory[) 2>NUL"') Do Set "%%G=" Set "index=0" For /F "EOL=? Delims=" %%G In ('Dir /B /A:D /O:N "%SourceLocation%" 2^>NUL' ) Do (Set /A index += 1 Set "subdirectory=%%G" SetLocal EnableDelayedExpansion Echo !index! !subdirectory! For /F "Tokens=1,*" %%H In ("!index! !subdirectory!") Do (EndLocal Set "subdirectory[%%H]=%%I")) If Not Defined subdirectory[1] Exit /B :Select Echo( Echo Please type the number(s) for the subdirectories you want to backup,Echo( Echo For multiple selections please separate each with spaces e.g. 1 3 6 Echo For none please type 0 or press [ENTER]. Set "selection=0" Set /P "selection=>" Set "selection=%selection:"=%" Set "selection=%selection:)=%" If Not Defined selection GoTo Select If "%selection%" == "0" GoTo :EOF (Set selection) | "%SystemRoot%\System32\findstr.exe"^ /X /R /C:"selection=[0123456789 ][0123456789 ]*" 1>NUL || GoTo Select Set "selection=%selection% " :BackUp For /F %%G In ( '"(Echo(%selection: =^&Echo(%) | "%SystemRoot%\System32\sort.exe" /Unique"' ) Do If Not Defined subdirectory[%%G] (Echo Selection %%G was not valid) Else ( SetLocal EnableDelayedExpansion Echo(&Echo Backing up subdirectory %%G !subdirectory[%%G]! "%SystemRoot%\System32\Robocopy.exe" ^ "%SourceLocation%\!subdirectory[%%G]!" ^ "%BackupLocation%\!subdirectory[%%G]!" /E /NC /NDL /NJH /NJS /NS ^ | %SystemRoot%\System32\find.exe /V " (0x00000005) " EndLocal) Pause 部分,我使用了 :BackUp 而不是您使用的已弃用的 Robocopy.exe 实用程序

如果您仍希望使用 xcopy.exe,请替换:

xcopy.exe

与:

    "%SystemRoot%\System32\Robocopy.exe" ^
     "%SourceLocation%\!subdirectory[%%G]!" ^
      "%BackupLocation%\!subdirectory[%%G]!" /E /NC /NDL /NJH /NJS /NS ^
       | %SystemRoot%\System32\find.exe /V " (0x00000005) "

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?