Войти

Показать полную графическую версию : Требуется помощь по удалению...


Страниц : [1] 2

ILMagus
10-12-2018, 21:02
Здравствуйте, уважаемые.
Возможно, проблема тривиальна, но самому не дойти до решения.
Есть папка Users, в ней папки с именами пользователей, в них, естественно еще куча подпапок и файлов. Требуется с помощью bat файла удалить определенные файлы во всех корневых папках пользователей, не затрагивая их подпапки. Только в корневых папках пользователей. То есть, к примеру, в папке C:\Users\Vasia удалить файлы с расширением txt, не затрагивая подпапки C:\Users\Vasia\Documents, C:\Users\Vasia\Desktop и т.д.
Учитывая, что пользователей около трех сотен, и имена у них разные, надо это как то автоматизировать.
"Del /s" в моем случае не подходит, так как удаляет файлы во всех вложенных папках, а не только в корневой каждого пользователя.

megaloman
10-12-2018, 21:45
@Echo Off
cls
Set "BoxIn=C:\Users"
Set "Box2=AppData"
Set "DelFile=*.txt"

FOR /F "usebackq delims=" %%u IN (`Dir /A:D /B "%BoxIn%"`) DO (
If Exist "%BoxIn%\%%u\%Box2%" (
Echo === "%BoxIn%\%%u\%DelFile%"
Dir /B /A:-D "%BoxIn%\%%u\%DelFile%"
)
)
Pause
GoTo :Eof Для боевой работы замените Dir /B /A:-D на Del

ILMagus
10-12-2018, 22:57
Спасибо, работает.
А зачем включена переменная AppData? Просто, чтобы убедиться, что каталог действительно пользовательский а не левый?

alpap
11-12-2018, 15:51
megaloman, а чего не перебрать файлы по путям переменной %Userprofile%

megaloman
11-12-2018, 16:49
alpap, а чего не перебрать файлы по путям переменной %Userprofile% »Для активного пользователя мне понятно. Но я не умею (увы мне!) иначе найти профили всех пользователей на одном компьютере, если их несколько. А переменная AppData, действительно, Просто, чтобы убедиться, что каталог действительно пользовательский. Возможно, это примитив и не корректно с точки зрения применимости для разных Win

alpap
11-12-2018, 18:42
megaloman,
я просто выразился так, а имел ввиду типа:

@echo off
set "d=C:\Users"

for /f "delims=" %%a in ('dir /ad/b "%d%"') do net user|>nul find "%%a"|| echo del /q "%d%\%%a\*"
pause

megaloman
11-12-2018, 19:24
alpap, ....... find "%%a" || echo ......имхо надо &&

alpap
11-12-2018, 20:25
надо ... »
не, мы же от этого имени работаем (себя только и найдем как в выводе %Userprofile%)
единственно, если что, то надо ставить в исключение пути:

"C:\Users\Administrator"
"C:\Users\All Users"
"C:\Users\Default"
"C:\Users\Default User"
"C:\Users\Public"
"C:\Users\Все пользователи"

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

mwz
11-12-2018, 20:52
найти профили всех пользователей на одном компьютере, если их несколько »

А через чтение реестра, анализом
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
определить?

megaloman
11-12-2018, 22:35
alpap, dir C:\Users\ /A:D /B

All Users
Default
Default User
User111111111111111111111
Public
User222222222222222222222
Все пользователи
Ваш скрипт с ||del /q "C:\Users\All Users\*"
del /q "C:\Users\Default\*"
del /q "C:\Users\Default User\*"
del /q "C:\Users\Public\*"
del /q "C:\Users\Все пользователи\*"
Ваш скрипт с &&del /q "C:\Users\User1111111111\*"
del /q "C:\Users\User2222222222\*"mwz, А через чтение реестра » - это надо поработать, предложите решение

mwz
11-12-2018, 23:18
предложите решение »

Что-то судя по вопросу, я неверно понял задачу... Но всё же (только принцип; хотя список папок пользователей может и проще обработать, тем более что в итоге фактически будем иметь то же самое):

Найти в ключе

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

все ветви, начинающихся на

S-1-5-21

(это SID-ы пользователей, причём тех, кто хотя бы раз залогинился в системе: если пользователь создан, но в систему ни разу не входил — его ключа здесь не будет, как и папки его).

И прочитать в каждом из найденных S-1-5-21 значение параметра ProfileImagePath, которое и укажет на папку этого пользователя.

Ну и напомню на всякий случай, что SID S-1-5-21-XXXXXXX-XXXXXXXX-XXXXXXXXXXX-500 — это встроенный администратор. Если он в систему не входил — ни ключа, ни папки его профиля тоже не будет создано.

alpap
11-12-2018, 23:44
Ваш скрипт с || »
точно
так я делал в таком случае, когда были заданы имена пользователей

for %%a in (user1 user2 userN) do net user|find "%%a"||echo del /s /q "C:\Users\%%a"

alpap
12-12-2018, 00:06
вот, собственно, все имена пользователей исключая текущего админа:

@echo off
for /f "skip=1 delims=" %%a in ('wmic path Win32_UserAccount get FullName /value^|find "="') do set "%%a"& call :#
pause& exit

:#
if not "%FullName%"=="" echo %FullName%
exit /b

(если брать Name, то будет и имя текущего админа и еще Администратор и Гость)

megaloman
12-12-2018, 00:37
mwz, @Echo Off
cls
Set "DelFile=*.txt"
For /f "delims=" %%i In ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"') Do Call :RegPars "%%i" "%DelFile%"
pause
GoTo :Eof

:RegPars
FOR /F "tokens=4* delims=-" %%a IN (%1) DO If %%a==21 (
For /f "skip=2 tokens=3 delims= " %%p In ('reg query %1 /v ProfileImagePath') Do (
Echo === %%p
Dir /A:-D /B "%%p\%~2"
)
)
GoTo :Eof
Наверное можно сделать элегантнее. (Dir /A:-D /B заменить на Del)

megaloman
12-12-2018, 14:07
Немного подумал и подсократил@Echo Off
cls
Set "DelFile=*.txt"
Set "BoxIn=C:\Users"
For /f "tokens=1,2* delims= " %%i In ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /S') Do (
If /I "%%i"=="ProfileImagePath" If /I "%%~dpk"=="%BoxIn%\" Echo === %%k &Dir /A:-D /B "%%k\%DelFile%"
)
pause
GoTo :Eof
Dir /A:-D /B --> Del
После поста alpap @Echo Off
cls
Set "DelFile=*.txt"
Set "BoxIn=C:\Users"
For /f "tokens=3 delims= " %%i In ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /S /V ProfileImagePath') Do (
If /I "%%~dpi"=="%BoxIn%\" Echo === %%i &Dir /A:-D /B "%%i\%DelFile%"
)
pause
GoTo :Eof

alpap
12-12-2018, 14:30
Может еще подумать? »
можно и сразу вывести

@echo off
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath"^|find /i "C:\Users"') do echo %%b
pause

даже [/v "ProfileImagePath"] можно убрать.

mwz
12-12-2018, 15:06
alpap
find /i "C:\Users"

В WS2003, например, этой подстроки в данном разделе нет вообще - при том, что значение ProfileImagePath указывает на правильную папку профиля. :)

DJ Mogarych
12-12-2018, 15:35
Powershell:
$dirs = "$env:SystemDrive\Users"
$ext = "*.txt"
dir $dirs -Directory | dir -File | where Name -like $ext | Remove-Item -Confirm:$false

alpap
12-12-2018, 17:09
В WS2003, например, »
а как там выглядит?
ведь нужны только определенные строки содержащие ProfileImagePath и еще их надо парсить до нужного вывода.

Iska
12-12-2018, 17:19
а как там выглядит? »
Documents and Settings, конечно. Для пользовательских учётных записей.




© OSzone.net 2001-2012