【问题标题】:How to combine this two "FOR" loops into one?如何将这两个“FOR”循环合二为一?
【发布时间】:2020-03-09 14:12:25
【问题描述】:

我正在尝试将两个 FOR 循环合二为一。

这是我的代码:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set BackupDest=D:\backup

for /D %%I in ("%HomeDrive%\users\*") do if exist "%BackupDest%\%%~nI\" (

xcopy "%HomeDrive%\users\%%~nI\Desktop" "%BackupDest%\%%~nI\Desktop\" /e /i /y
xcopy "%HomeDrive%\users\%%~nI\Documents" "%BackupDest%\%%~nI\Documents\" /e /i /y

)

for /f "tokens=*" %%I in ('dir /a:d-h /b "%HomeDrive%\users\*" ^| findstr /b /e /i /l /v /g:"%~dp0\bin\exclude_users.txt"') do if not exist "%BackupDest%\%%~nI\" (
echo Destination folder of the user %%~nI is missing
)

我确定在这种情况下我们是否可以这样做?

如果是,我该如何实现?

任何帮助都会非常有帮助。

【问题讨论】:

    标签: windows for-loop batch-file if-statement


    【解决方案1】:
    @echo off
    setlocal
    
    set "BackupDest=D:\backup"
    
    for /f "tokens=*" %%I in (
        'dir /a:d-h /b "%HomeDrive%\users\*" ^| findstr /b /e /i /l /v /g:"%~dp0exclude_user.txt"'
    ) do (
        if exist "%BackupDest%\%%~nxI\" (
            xcopy "%HomeDrive%\users\%%~nxI\Desktop" "%BackupDest%\%%~nxI\Desktop\" /e /i /y
            xcopy "%HomeDrive%\users\%%~nxI\Documents" "%BackupDest%\%%~nxI\Documents\" /e /i /y
        ) else (
            echo Destination folder of the user %%~nxI is missing
        )
    )
    

    使用if exist ... (...) else (...) 语法。

    文件夹的名称使用修饰符nx,因为文件夹可以命名为firstname.lastname。 如果你只使用n,那么你只会得到文件夹名称firstname的一部分。

    【讨论】:

    • 该代码适用于典型的用户配置文件文件夹,但如果用户配置文件文件夹以空格和/或分号开头,则会失败。这当然是非常不可能的。 "tokens=*" 导致首先从行(没有路径的文件夹名称)中删除所有前导空格/制表符,然后检查剩余的字符串是否以分号开头,在这种情况下,for 将忽略行(文件夹名称)。更好的是使用"eol=| delims=",它完全禁用行拆分行为,并确保没有文件夹名称被忽略,因为没有文件夹名称可以在其名称中包含|
    • 在这种情况下,最好只使用%%I 而不是%%~nxIdir 输出在%HomeDrive%\users 中找到的文件夹名称,但路径与该文件夹中存在的路径完全相同。 %%~nxI 的使用导致在当前目录中搜索名称为循环变量 I 的文件或目录,如果当前目录中确实存在这样的文件/文件夹,则使用当前目录中的名称和扩展名用户目录中的文件夹名称。
    • 例如,如果C:\Users 包含一个目录UserName 并且当前目录有一个文件或目录USERNAME,则%%~nxI 将扩展为USERNAME%%I 将扩展为@987654343 @。因此,最好在此代码中使用%%I,以避免在循环迭代期间为分配给循环变量I 的每个目录名称在当前目录中进行额外的文件系统访问,并且可能会更改目录名称字母的大小写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多