民间,
我尝试使用for循环设置变量并根据set变量执行命令。但是,当我尝试这样做时,我会得到奇怪的行为。
命令:
FOR /D %%G in (*) DO SET matr=%%~nG&& robocopy %matr%\AppData\Local\Microsoft\Outlook "E:\Backup - %computername%\Users\%matr%\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - %computername%\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
说明:
对于给定文件夹中的每个文件夹(C:\ Users \,在我的脚本中先前说明),设置一个名为matr的变量,其中包含文件夹的名称。目的是在每个循环中查找C:\ Users中的下一个文件夹,并将该变量设置为文件夹的名称。 之后,我使用变量作为源的起点运行robocopy。例如,在C:\ Users上找到的第一个文件夹将是管理员,这应该使我的robocop使用administrator \ Appdata \ Local \ Microsoft \ Outlook作为源。 目标也将使用该变量来定位外部驱动器中的文件夹,在其中的特定文件夹中。
这是我使用管理权限运行脚本时获得的行为:
E:\>cd /D C:\Users\
C:\Users>FOR / %G in (*) DO SET matr=%~nG && robocopy \AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
C:\Users>SET matr=Administrador && robocopy \AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
我不明白为什么变量会变空。 我尝试使用SETLOCAL ENABLEDELAYEDEXPANSION并使用!matr!而不是%matr%但无济于事。使用时!matr!而不是%matr%,批次将其识别为直接文本而不是变量调用。
代码的相关部分:
SETLOCAL ENABLEDELAYEDEXPANSION
cd /D C:\Users\
FOR /D %%G in (*) DO SET matr=%%~nG&& robocopy %matr%\AppData\Local\Microsoft\Outlook "E:\Backup - %computername%\Users\%matr%\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - %computername%\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
echo Outlook backup done!
echo.
pause
未设置enabledelayedexpansion并使用单个%matr%:
时的行为E:\>cd /D C:\Users\
C:\Users>FOR / %G in (*) DO SET matr=%~nG && robocopy \AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
C:\Users>SET matr=Administrador && robocopy \AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
设置enabledelayedexpansion并使用double %% matr %%:
时的行为E:\>cd /D C:\Users\
C:\Users>FOR / %G in (*) DO SET matr=%~nG && robocopy %matr%\AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\%matr%\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
C:\Users>SET matr=Administrador && robocopy %matr%\AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\%matr%\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
设置enabledelayedexpansion并使用single!matr!:
时的行为E:\>cd /D C:\Users\
C:\Users>FOR / %G in (*) DO SET matr=%~nG && robocopy !matr!\AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\!matr!\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
C:\Users>SET matr=Administrador && robocopy !matr!\AppData\Local\Microsoft\Outlook "E:\Backup - P43971\Users\!matr!\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - P43971\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
答案 0 :(得分:1)
您需要仔细阅读delayed expansion
上的一些SO文章,告诉我们您tried putting SETLOCAL ENABLEDELAYEDEXPANSION and using !matr! instead of %matr%
的方式,因为我们无法从此处清楚地看到您的终端。
快速回答是根本不使用matr
。尝试
FOR /D %%G in (*) DO robocopy %%~nG\AppData\Local\Microsoft\Outlook "E:\Backup - %computername%\Users\%%~nG\AppData\Local\Microsoft\Outlook" /s /b /log+:"E:\Backup - %computername%\Log de Backup.txt" /v /A-:SHR /r:2 /w:5 /tee
其中%%~nG
可能包含您的期望。
答案 1 :(得分:1)
而不是:
FOR /D %%G in (*) DO
你可以用这个:
For /F "Delims=" %%G In ('Dir /B/AD') Do
或者,此建议使用不同的方式来解析用户配置文件名称。它使用WMIC
检索For /F
循环中的所有本地非特殊配置文件名称:
@Echo Off
Set "SP=AppData\Local\Microsoft\Outlook"
Set "DP=E:\Backup - %ComputerName%"
Set "BL=Log de Backup.txt"
Set "RP=/S /B /A-:RSH /R:2 /W:5 /V /TEE"
For /F Tokens^=2^Delims^=^" %%A In ('WMIC Path Win32_UserProfile Where^
"Special!='TRUE'" Assoc /AssocClass:Win32_UserAccount 2^>Nul'
) Do For /F "Tokens=1*Delims==" %%B In ('WMIC UserAccount Where^
"SID='%%A' And LocalAccount='TRUE'" Get Name /Value'
) Do For /F "Tokens=*" %%D In ("%%C"
) Do RoboCopy "%%D\%SP%" "%DP%\Users\%%D\%SP%" %RP% /LOG+:"%DP%\%BL%"
All Users
,Default
,Default User
和Public
是特殊系统服务配置文件的示例,使用此方法可忽略但不使用{{1例子