从Windows批处理脚本中调用变量

时间:2018-01-24 12:32:54

标签: windows batch-file

民间,

我尝试使用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

2 个答案:

答案 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 UsersDefaultDefault UserPublic是特殊系统服务配置文件的示例,使用此方法可忽略但不使用{{1例子