Пакетный файл: пропуск папок, начинающихся с _ в цикле FOR - PullRequest
1 голос
/ 24 апреля 2020

Я хотел бы исключить все профили, начинающиеся с _ без необходимости перечисления каждого профиля в текстовом файле исключения.

Возможно ли это сделать?

@echo off
set Target=D:\backup

        for /f "tokens=*" %%I in ('dir /a:d-h /b "%SystemDrive%\Users\*"') do if exist "%Target%\%%~nXI\" (

    ........

)

pause
exit

Большое спасибо заранее за помощь!

1 Ответ

2 голосов
/ 24 апреля 2020

В следующем примере кода представлена ​​методика получения требуемых имен профилей, (те, которые не являются специальными учетными записями и чьи имена не начинаются с подчеркивания) вместе с их текущими путями в профилях.

@For /F "Skip=1Tokens=1,2" %%G In ('%__AppDir__%wbem\WMIC.exe UserAccount Where^
 "LocalAccount='True' And Not Name Like '[_]%%'" Get Name^,SID 2^>Nul'
)Do @For /F %%I In ("%%H")Do @For /F "Tokens=2Delims==" %%J In ('
 %__AppDir__%wbem\WMIC.exe Path Win32_UserProfile Where^
 "SID='%%I' And Special!='True'" Get LocalPath /Value 2^>Nul'
)Do @For /F "Tokens=*" %%K In ("%%J")Do @Echo User name:"%%G",Profile path:"%%K"
@Pause

Хотя вышесказанное напрямую не поможет вам в вашей задаче, ее можно очень просто адаптировать для этого. (Он даже дает вам возможность использовать %%K, если вы копируете / перемещаете объекты между путем к профилю и целевым каталогом.) :

@Set "Target=D:\backup"
@For /F "Skip=1Tokens=1,2" %%G In ('%__AppDir__%wbem\WMIC.exe UserAccount Where^
 "LocalAccount='True' And Not Name Like '[_]%%'" Get Name^,SID 2^>Nul'
)Do @For /F %%I In ("%%H")Do @For /F "Tokens=2Delims==" %%J In ('
 %__AppDir__%wbem\WMIC.exe Path Win32_UserProfile Where^
 "SID='%%I' And Special!='True'" Get LocalPath /Value 2^>Nul'
)Do @For /F "Tokens=*" %%K In ("%%J")Do @If Exist "%Target%\%%G\" (
    Rem …your code here
)
@Pause


Если есть вероятность, что у вас есть имена пользователей, содержащие пробелы, ответ становится немного более сложным. Это можно сделать проще, если вы определенно выполняете это на системах, которые не Windows 7, но это должно работать независимо от того, какую поддерживаемую ОС вы используете.
@Set "Target=D:\backup"
@For /F Tokens^=4Delims^=^" %%G In ('%__AppDir__%wbem\WMIC.exe UserAccount^
 Where "LocalAccount='TRUE' And Not Name Like '[_]%%'" Assoc:List^
 /ResultRole:SID 2^>NUL')Do @For /F Tokens^=1* %%H In (
 '%__AppDir__%wbem\WMIC.exe UserAccount Where "Name='%%G'" Get SID^
 /Value 2^>NUL^|%__AppDir__%find.exe "="')Do @For %%I In (%%H
)Do @For /F "Tokens=1*Delims==" %%J In ( 
 '%__AppDir__%wbem\WMIC.exe Path Win32_UserProfile Where^
 "SID='%%I' And Special!='TRUE' And LocalPath Is Not Null" Get LocalPath /Value^
 2^>NUL^|%__AppDir__%find.exe "="')Do @For /F "Tokens=*" %%L In ("%%K"
)Do @If Exist "%Target%\%%G\" (
    Rem …your code here
)
@Pause

В В этом примере путь к вашему профилю пользователя будет присвоен %%~L (в отличие от %%K в предыдущем примере.).

...