Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 4

Автор: 01MDM
Дата сообщения: 14.11.2007 13:41
Cyril Konst

Цитата:

Дело в том, что логины юзеров и названия их каталогов-профилей не всегда совпадают...


Код:
@echo off
for /f "tokens=*" %%i in ('dir /b /a:d "%HOMEDRIVE%\DOCUMENTS AND SETTINGS"') do (
set "user=%%i"
call:next
)

7z a -t7z docs.7z arch\
goto:eof

:next
if "%user%" equ "Администратор" goto:eof
if "%user%" equ "NetworkService" goto:eof
if "%user%" equ "All Users" goto:eof
if "%user%" equ "Default User" goto:eof
if "%user%" equ "LocalService" goto:eof
xcopy /s /i "%HOMEDRIVE%\Documents and Settings\%user%\Мои Документы" "arch\%user%"
Автор: Tipulatoid
Дата сообщения: 14.11.2007 14:09
soulthiefer

Цитата:
пытаюсь запустить через коммандную .. bilarm.exe /set 0:12:12:12 пишет что не выбрана материнская плата !!! а как же ее выбрать то ?!?!?(

Это значит, запусти Bilarm просто, без параметров, там пройдись по настройкам, найди где выставляются материнки и ыбери в том списке свою, если она там есть. Моей нет, например
Автор: Nagual
Дата сообщения: 15.11.2007 04:29
Cyril Konst
saveuserdocs.cmd
Код: @[no]echo[/no] off
[no]chcp[/no] 1251[no]>[/no][no]nul[/no]
[no]for[/no] /f "delims[no]=[/no]" [no]%%a[/no][no] in[/no] ('[no]dir[/no]/b/a:d "[no]%userprofile%[/no]\.."') [no]do[/no] [no]if[/no] [no]exist[/no] "[no]%userprofile%[/no]\..\[no]%%a[/no]\Мои документы" xcopy/y/e/v/c/i/h/r/k/g "[no]%userprofile%[/no]\..\[no]%%a[/no]\Мои документы" "docs\[no]%%a[/no]\Мои документы\"
[no]if exist[/no] "docs\Администратор"[no] rd[/no]/s/q "docs\Администратор"
[no]set[/no] arcname[no]=[/no]documents.7z
[no]if exist[/no] [no]%arcname%[/no][no] del[/no]/q [no]%arcname%[/no]
7z u -r [no]%arcname%[/no] docs
[no]rd[/no]/s/q docs
Автор: Nagual
Дата сообщения: 15.11.2007 07:42
вот еще один вариант
saveuserdocs.cmd
Код: @[no]echo[/no] off
[no]chcp[/no] 1251[no]>[/no][no]nul[/no]
[no]for[/no] /f "tokens[no]=[/no]2 delims[no]=[/no]\ " [no]%%a[/no] [no]in[/no] ('wmic useraccount list status^[no]|[/no]findstr/i true') [no]do[/no] [no]if[/no] [no]exist[/no] "[no]%userprofile%[/no]\..\[no]%%a[/no]\Мои документы" xcopy/y/e/v/c/i/h/r/k/g "[no]%userprofile%[/no]\..\[no]%%a[/no]\Мои документы" "docs\[no]%%a[/no]\Мои документы\"

[no]set[/no] arcname[no]=[/no]documents.7z
[no]if exist[/no] [no]%arcname%[/no][no] del[/no]/q [no]%arcname%[/no]
[no]cd[/no]/d docs
7z a -r ..\[no]%arcname%[/no] .
[no]:: rd/s/q docs[/no]
Автор: Cyril Konst
Дата сообщения: 15.11.2007 08:16
Nagual
Первый скрипт работает, спасибо
А второй начинает весь профиль копировать...
Автор: Nagual
Дата сообщения: 15.11.2007 09:16
Cyril Konst
возможные ошибки:
1. если все папки Мои документы пустые, то сценарий работает некорректно
вероятность этого очень мала и сомнительна, учитывая, что у тебя много юзеров, поэтому проверку смысла делать нет
2. 7z должен лежать в %path%
если нет, что пиши полный путь к нему
если 7z лежит рядом со сценарием и не лежит в %path%, то исправь предпоследнюю строку на ..\7z a -r ..\%arcname% .
3. также проверь кодировку сценария, оба сценария написаны для кодировки windows-1251 (cp1251)
4. также проверь версию 7z
в более старых версиях для работы с кодировкой cp1251 необходимо добавлять параметр -scswin, то есть команда будет такой
7z a -r -scswin ..\%arcname% .
5. также проверь концевые пробелы, есть вероятность, что из-за них код может работать неправильно
достоинства второго сценария:
он копирует непосредственно папки "Мои документы" пользователей, то есть в нем отсуствует надобность в определении и удалении папок "Мои документы", не относящихся к категории пользователей
код тестировался на win2k3 и winxpsp2
работает корректно под аккаунтом администратора

Добавлено:
если имя компьютера содержит пробел(ы), то необходимо немного переписать сценарий
Автор: ProbaRK
Дата сообщения: 15.11.2007 09:49
Nagual

Попробовал Ваш saveuserdocs.cmd в обоих вариантах, точнее только часть их.

в первой версии
Цитата:
('dir/b/a;d "%userprofile%\..\"')
работает только при наличии двоеточия, вместо точки с запятой, если запускать из под FAR-а, то
Цитата:
chcp 1251>nul
надо убрать, во всяком случае у меня так работает.
Строки

Цитата:
if exist "docs\NetworkService" rd/s/q "docs\NetworkService"
if exist "docs\All Users" rd/s/q "docs\All Users"
if exist "docs\Default User" rd/s/q "docs\Default User"
if exist "docs\LocalService" rd/s/q "docs\LocalService"

не нужны, в этих профилях нет папок "Мои документы"

Второй вариант saveuserdocs.cmd у меня заработал, если то, что в скобках записать так:
('wmic useraccount list status ^| findstr/i OK')
Автор: Nagual
Дата сообщения: 15.11.2007 10:43
ProbaRK

Цитата:
('wmic useraccount list status ^| findstr/i OK')

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

Цитата:
работает только при наличии двоеточия

да, конечно, не углядел при замене
ессно тут должно быть двоеточие, исправлено
при такой записи ('wmic useraccount list status ^| findstr/i TRUE') работает?

Добавлено:
ProbaRK
да, ты прав, лишние строки удалены
Автор: 01MDM
Дата сообщения: 15.11.2007 11:33
Nagual
Странная конструкция %userprofile%\..\
echo выдает неправильное значение, а if не ошибается

Код:
@echo off
for /f "tokens=*" %%i in ('dir /b /a:d "%userprofile%\..\"') do (
echo "%userprofile%\..\%%i"
if exist "%userprofile%\..\%%i\Мои Документы" echo %%i-exist && echo.
)
Автор: Nagual
Дата сообщения: 15.11.2007 11:49
01MDM
ничего странного, это родительский каталог профиля текущего пользователя просто эту конструкцию надо тестить не командой echo, а примерно так
cd/d "%userprofile%\.." &echo %cd%


Добавлено:
просто именно такая запись гарантирует, что ты получишь именно каталог документов и настроек, то есть путь к каталогу с профилями, даже если он будет переопределён каким либо образом
Автор: ProbaRK
Дата сообщения: 15.11.2007 13:35
Nagual

Цитата:
такая запись неверна, так как не будет удовлетворять требованиям поставленной задачи и под эту категорию попадет админимстративный аккаунт

Вы же его в любом случае копируете и затем стираете (правда в первом скрипте)

Цитата:
if exist "docs\Администратор" rd/s/q "docs\Администратор"


а во втором скрипте, если не использовать findstr/i OK , то аккаунты одноранговых сетей, где PasswordExpires установлено в FALSE (Срок действия пароля не ограничен), скрипт не найдет ничего. Т.е. отбор строк надо выполнять по колонке Status.
Автор: 01MDM
Дата сообщения: 15.11.2007 17:27
Nagual

Цитата:

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

Нет не гарантирует, твой профиль может быть на C:, а у Иванова на D:

Код:
reg query hklm\software\microsoft\windows\currentversion\explorer\docfolderpaths
Автор: ProbaRK
Дата сообщения: 16.11.2007 00:04
01MDM

Цитата:
Код:
reg query hklm\software\microsoft\windows\currentversion\explorer\docfolderpaths


Вот это я думаю надежней


Интересно то, что на домашней машине был создан и впоследствии удален тестовый аккаунт штатными средствами ОС, а ключ в реестре и путь к уже не существующей папке C:\Documents and Settings\22\Мои документы - остались.

Проверка на %homedrive% оказалась полезной.
Автор: Cyril Konst
Дата сообщения: 16.11.2007 08:00
Надёжнее всего брать список юзерей и искать по ним их каталог в реестре.
Автор: Tipulatoid
Дата сообщения: 16.11.2007 08:20
123Maximus123

Цитата:
Проблема в том что мне надо что бы этот архив создавался на сервере \\server\
Может кто подскажи решение этой проблемы пробовал подключать сетевой диск тоже самое не может создать архив на нём

Если не rar не умеет сохранять на сетевой диск (я это не проверял), то просто после создания архива перемести его на сетевой диск командой move. т.е. убери строку exit из кода (кстати, зачем она нужна?) и вставь вместо нее
Код:
mkdir \\server\backup\%FOLDER%\
move C:\backup\%FOLDER%\backup.rar \\server\backup\%FOLDER%\
Автор: FEvER
Дата сообщения: 17.11.2007 12:14
Подскажите как получить название папки с выполняемым скриптом (НЕ путь, именно название). Путь получаю с помощью %~dp0 а вот как из него вырезать только последнюю папку - хз
Автор: 01MDM
Дата сообщения: 17.11.2007 12:42
FEvER

%~n0
Автор: Elroir
Дата сообщения: 17.11.2007 12:46
FEvER

Код:
@echo off
set "fp=%~dp0"
set "fp=%fp:~0,-1%"
call :extr "%fp%"
goto :EOF
:extr
echo %~nx1
Автор: FEvER
Дата сообщения: 17.11.2007 12:47
01MDM Выдает название файла, а мне нужно название папки

Elroir спасибо работает!
Автор: Elroir
Дата сообщения: 17.11.2007 12:48
01MDM
Ты поторопился
Автор: 01MDM
Дата сообщения: 17.11.2007 12:56
FEvER
Elroir
В контексте поставленной задачи, какой вопрос - такой ответ. Подразумевалось что файлы не в счет, как:

Код:
@echo off
for /f "tokens=*" %%i in ('dir /b /a:d') do echo %~ni
Автор: Elroir
Дата сообщения: 17.11.2007 13:11
01MDM
По моему - задача была поставлена корректно. Ясно же было сказано - название последней папки в пути, а не файла. Но даже так, твой код неправильный - если название с точкой (точками), он выдает только часть до последней точки.
Автор: 01MDM
Дата сообщения: 17.11.2007 13:17
Elroir
согласен %~nxi


Добавлено:
Т.е

Код:
@echo off
set "cpath=X:\Some\&Folder.Name!"
for /f "tokens=*" %%i in ("%cpath%") do echo %%~nxi
Автор: Omul2
Дата сообщения: 18.11.2007 11:39
Уже голову сломал, помогите...
Имеется папка или диск. Закидываем туда батник, запускаем, он должн делать бэкап содержимого папки в которой находиться (копировать через xcopy), по пути c:\bacup\_имя папки где находится батник\_. Если же он лежит в корне диска, то должен копировать файлы по пути c:\bacup\_метка тома диска где находится батник_\ Если метка тома пуста, имя папки в бэкапе будет стандартное - MyDisk.
Автор: Maza Faka
Дата сообщения: 18.11.2007 13:13
Omul2
Попробуй:

Код:
@echo off
setlocal enabledelayedexpansion
chcp 1251>nul

echo %~dp0> size.tmp

for %%a in (size.tmp) do set size=%%~za

if %size% equ 5 (
for /f "tokens=5,7*" %%a in ('vol %~d0') do (
if "%%a"=="имеет" (
set volume=%%b %%с) else (set volume=MyDisk)
)
xcopy "*.*" "c:\bacup\!volume!\*.*" /i /k /r /y /q
) else (
for /f "delims=" %%a in ('echo %~p0') do xcopy "*.*" "c:\bacup%%a\*.*" /i /k /r /y /e)

del /q size.tmp
Автор: Omul2
Дата сообщения: 18.11.2007 13:58
Спасибо, уважаемый монстр Maza Faka!
Почти все работает... Можно пару вопросов?
Как вычисляется текущая папка, можно поподробнее? интересует переменная %%~za и кусочек if %size% equ 5 . Как это работает?
Можно ли скрипт сделать мультиязычным, чтоб корректно работал в английской версии?
Из метки диска вычисляется только первое слово, например диск будет назван My Disk, папка будет называться My.
Заранее благодарю...
Автор: Maza Faka
Дата сообщения: 18.11.2007 14:36
Omul2

Цитата:
Как вычисляется текущая папка

echo %~p0 получаем путь к батнику


Цитата:
интересует переменная %%~za и кусочек if %size% equ 5

Из справки:

Цитата:
%~zI - Замена %I размером файла


Цитата:
Оператор Описание
EQU равно





Цитата:
Из метки диска вычисляется только первое слово, например диск будет назван My Disk, папка будет называться My.

Извиняюсь, поторопился, код исправил см. предыдущий пост.


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

Да, конечно, постараюсь сделать.


Цитата:
уважаемый монстр Maza Faka!

Да я совсем не страшный
Автор: Omul2
Дата сообщения: 18.11.2007 15:38
Монстрами я называю мегашарящих людей
Отлично! все работает, спасибо...
Теперь такая тема.
Я типа, хочу сделать мегабэкапер всего на бат файле
Альернатива Акрониксу в килобайте,
Единственная проблема - бэкапер должен уметь сжимать файлы. В Window XP нет нормальных архиваторов, придется готовый инкрементный бэкап (или как его там) сначала создавать, потом жать. XP криво жмет, в кабинеты, которые не понимаются другими осями, и zip, который.. ну уже говорилось...
Идея такова - нести внутри батника заготовку пустого zip файла, (22 байта) создавать его, а потом делать над ним операции с помощью rundll - удалять и добавлять туда файлы . Возможно ли это?
Просто мне претят довески к основному коду батника. Хотя... unZip32.exe можно засунуть внуть батника?
Сорри, если эта тема и идея обсуждалась, но прочитать 400 страниц форума очень тяжело..
Автор: Nagual
Дата сообщения: 18.11.2007 15:55
Omul2
так бы и говорил
есть robocopy и xxcopy для бэкапа
а 7z для сжатия
неужели не устраивают?
зачем извращаться?
Автор: Omul2
Дата сообщения: 18.11.2007 16:05
Можно ссылочки?

Добавлено:
Ок, посмотрел, дело в том, Nagual, что эти программы СЛОЖНЫ. Для меня программа бэкапа должна быть простая как отвертка. Просто запустил, и все. В крайнем случае нажал энтер еще. Ну в более крайнем - настроил под себя.
Вот например - http://minilabmaster.com/2/36_1.shtml
Сам ее писал и пользуюсь, ничего лишнего. (не сочтите за рекламу)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: Доступ к реестру через RegEdit?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.