![]() |
Требуется помощь по удалению...
Здравствуйте, уважаемые.
Возможно, проблема тривиальна, но самому не дойти до решения. Есть папка Users, в ней папки с именами пользователей, в них, естественно еще куча подпапок и файлов. Требуется с помощью bat файла удалить определенные файлы во всех корневых папках пользователей, не затрагивая их подпапки. Только в корневых папках пользователей. То есть, к примеру, в папке C:\Users\Vasia удалить файлы с расширением txt, не затрагивая подпапки C:\Users\Vasia\Documents, C:\Users\Vasia\Desktop и т.д. Учитывая, что пользователей около трех сотен, и имена у них разные, надо это как то автоматизировать. "Del /s" в моем случае не подходит, так как удаляет файлы во всех вложенных папках, а не только в корневой каждого пользователя. |
Код:
@Echo Off |
Спасибо, работает.
А зачем включена переменная AppData? Просто, чтобы убедиться, что каталог действительно пользовательский а не левый? |
megaloman, а чего не перебрать файлы по путям переменной %Userprofile%
|
alpap,
Цитата:
|
megaloman,
я просто выразился так, а имел ввиду типа: Код:
@echo off |
alpap,
Цитата:
|
Цитата:
единственно, если что, то надо ставить в исключение пути: Скрытый текст
"C:\Users\Administrator" "C:\Users\All Users" "C:\Users\Default" "C:\Users\Default User" "C:\Users\Public" "C:\Users\Все пользователи" но обычно там только папки, файлов нет, ведь в задаче мы не опускаемся ниже первого уровня. |
Цитата:
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList |
alpap,
Посмотрите
Код:
dir C:\Users\ /A:D /B Код:
del /q "C:\Users\All Users\*" Код:
del /q "C:\Users\User1111111111\*" Цитата:
|
Цитата:
Найти в ключе 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 — это встроенный администратор. Если он в систему не входил — ни ключа, ни папки его профиля тоже не будет создано. |
Цитата:
так я делал в таком случае, когда были заданы имена пользователей Код:
for %%a in (user1 user2 userN) do net user|find "%%a"||echo del /s /q "C:\Users\%%a" |
вот, собственно, все имена пользователей исключая текущего админа:
Код:
@echo off |
mwz,
Код:
@Echo Off |
Немного подумал и подсократил
Код:
@Echo Off Может еще подумать?
После поста alpap
Код:
@Echo Off |
Цитата:
Код:
@echo off |
alpap
find /i "C:\Users" В WS2003, например, этой подстроки в данном разделе нет вообще - при том, что значение ProfileImagePath указывает на правильную папку профиля. :) |
Powershell:
Код:
$dirs = "$env:SystemDrive\Users" |
Цитата:
ведь нужны только определенные строки содержащие ProfileImagePath и еще их надо парсить до нужного вывода. |
Цитата:
|
|
У меня через реестр вообще не показывает новосозданных юзеров, а так показывает:
Код:
@echo off |
ИМХО, вот это должно работать и в 2003, проверить не на чем
Код:
@Echo Off |
Цитата:
Вообще же, все вещи, связанные с манипуляциями над файлами в профилях пользователей, за редким исключением, должны проводиться logon/logoff-скриптами, привязанными к этим пользователям. |
Цитата:
Как и со скриншом из WS2003: там сразу после установки несколько лет назад было создано ещё 4 пользователя. Но они ни разу не логинились, заходят (и то не все) только по ftp, и их профили созданы не были. Исходная же задача — чистить файлы в профилях пользователей; а если профиля нет — то и чистить исходно нечего. Цитата:
Скрытый текст
c:\TEMP>Set "DelFile=*.txt"
c:\TEMP>For /F "delims=" %a In ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsof t\Windows NT\CurrentVersion\ProfileList" /F "S-1-5-21-*"') Do (For /F "Skip=2 to kens=3 delims= " %i In ('2>nul reg query "%a" /V ProfileImagePath') Do Echo === %i & Dir /A:-D /B "%i\*.txt" ) c:\TEMP>(For /F "Skip=2 tokens=3 delims= " %i In ('2>nul reg query "HKEY_LOCAL_M ACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1449298 094-4144929868-1542513627-1030" /V ProfileImagePath') Do Echo === %i & Dir /A: -D /B "%i\*.txt" ) c:\TEMP>Echo === C:\Documents & Dir /A:-D /B "C:\Documents\*.txt" === C:\Documents The system cannot find the file specified. c:\TEMP>(For /F "Skip=2 tokens=3 delims= " %i In ('2>nul reg query "HKEY_LOCAL_M ACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1449298 094-4144929868-1542513627-500" /V ProfileImagePath') Do Echo === %i & Dir /A:- D /B "%i\*.txt" ) c:\TEMP>Echo === C:\Documents & Dir /A:-D /B "C:\Documents\*.txt" === C:\Documents The system cannot find the file specified. c:\TEMP>(For /F "Skip=2 tokens=3 delims= " %i In ('2>nul reg query "End of searc h: 2 match(es) found." /V ProfileImagePath') Do Echo === %i & Dir /A:-D /B "%i \*.txt" ) c:\TEMP>pause Press any key to continue . . . |
mwz, Там сложнее: при разборе не было учтено, что "Documents and Settings" содержит пробелы. Исправил. Если можно, протестируйте, пожалуйста.
Кстати, я обычно при отладке при Echo On записываю получившееся в файл способом файл.bat >результат.txt 2>&1 Читабельность лучше. Единственное, если есть пауза, надо на черном экране энтер нажать для завершения батника. |
Вложений: 1
Цитата:
Вот теперь вроде нормально (не знаю только, что за значок появился в результате выполнения команды cls :) — тут-то его видно не будет, так что приложил скриншот): Скрытый текст
c:\TEMP>cls
c:\TEMP>Set "DelFile=*.txt" c:\TEMP>For /F "delims=" %a In ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /F "S-1-5-21-*"') Do (For /F "Skip=2 tokens=2,* delims= " %i In ('2>nul reg query "%a" /V ProfileImagePath') Do Echo === %j & Dir /A:-D /B "%j\*.txt" ) c:\TEMP>(For /F "Skip=2 tokens=2,* delims= " %i In ('2>nul reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1449298094-4144929868-1542513627-1030" /V ProfileImagePath') Do Echo === %j & Dir /A:-D /B "%j\*.txt" ) c:\TEMP>Echo === C:\Documents and Settings\UpdatusUser & Dir /A:-D /B "C:\Documents and Settings\UpdatusUser\*.txt" === C:\Documents and Settings\UpdatusUser Test.txt c:\TEMP>(For /F "Skip=2 tokens=2,* delims= " %i In ('2>nul reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-21-1449298094-4144929868-1542513627-500" /V ProfileImagePath') Do Echo === %j & Dir /A:-D /B "%j\*.txt" ) c:\TEMP>Echo === C:\Documents and Settings\Administrator & Dir /A:-D /B "C:\Documents and Settings\Administrator\*.txt" === C:\Documents and Settings\Administrator Test1.txt c:\TEMP>(For /F "Skip=2 tokens=2,* delims= " %i In ('2>nul reg query "End of search: 2 match(es) found." /V ProfileImagePath') Do Echo === %j & Dir /A:-D /B "%j\*.txt" ) c:\TEMP>pause Press any key to continue . . . c:\TEMP>GoTo :Eof |
Цитата:
Цитата:
Кстати, что за хост на скриншоте? |
Цитата:
Если не на последнем — то это мой домашний серверок. А значок... Проверил исходный текст, хотя мог бы и сразу сообразить это сделать — и увидел, что в вывод действительно ушёл код 0x0C. Ну а значок — это просто такой глиф в шрифте, которым пошла вставка: с номером непечатного символа 000С в рамке. При других шрифтах он и смотрится по-другому (или не виден вообще), поскольку глифы другие. |
Цитата:
![]() явно же не гольная консоль. |
Iska
А, так это окно ввода в FireFox 63.0.3 :) Куда я Ctrl+V сделал. А в IE, как я сейчас посмотрел, этот значок не проявляется. |
Цитата:
|
Цитата:
PS А, наконец-то понял смысл вопроса. :) Нет, не из консоли. |
Цитата:
![]() Оказывается, я просто сто лет не использовал команду CLS в пакетных файлах :lol:. Цитата:
|
mwz, Простите меня! Надо делать так: файл.bat >результат.txt 2>&1 При этом и сообщения CMD о ошибках тоже попадут в файл, что при отладке немаловажно. А первый символ при этом меня никогда не напрягал и я о нём даже не задумывался. Спасибо Iska, просветил
|
Я тогда напишу сюда же, как сие может выглядеть под Far Manager'ом:
Скрытый текст
Код:
@echo off ![]() где «edit:» — префикс плагина FarCmd, указывающий плагину перехватить вывод («<») stdout и stderr («*») команды, в роли которой в данном случае выступает "%comspec% /c" с параметром «0003.cmd». Перехваченный вывод направляется во временный файл, который открывается в редакторе: ![]() Если нужно направить вывод stdout и stderr в отдельные окна — вместо «*» используется «?». Команду можно поместить в меню пользователя (вызываемое по «F2») и пользовать по необходимости. Я чаще всего пользую данный плагин для получения справки, в несколько изменённом виде, а именно в виде Lua-кода: Код:
lua:if CmdLine.Empty then print("edit:<" .. mf.clip(0)); else Keys("CtrlHome");print("edit:<"); Keys("CtrlEnd Enter"); end; ![]() В общем и целом — до чёртиков удобно. |
Цитата:
|
mwz, возьмите, например, батник от Iska
Запустите его. (Для определенности обзовём его файл.bat) Получите на консоли то что в эхо и сообщение об отсутствующей команде. Запустите файл.bat >результат.txt Получите в тхт- файле то, что в эхо, и на консоли сообщение об отсутствующей команде Запустите файл.bat >результат.txt 2>&1 Получите в файле и то, что в эхо, и аварийное сообщение об отсутствующей команде Стандартно вывод направляется в поток с дескриптором 1 (мы его направляем в файл. Ошибочные сообщения направляются в поток 2. Указание 2>&1 перенаправляет этот поток туда же, куда направлен поток 1. Поищите в гугле cmd перенаправление вывода. |
Цитата:
Код:
@echo off& for /f %%a in ('cls') do echo:%%a& pause>nul |
alpap, значит, вероятнее всего, моё предположение было неверным, и ClearScreen реализует сам командный процессор через «сладкую парочку» FillConsoleOutputCharacter() и FillConsoleOutputAttribute().
|
Время: 23:14. |
Время: 23:14.
© OSzone.net 2001-