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

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

Автор: sipok
Дата сообщения: 04.04.2008 15:54
igor_andreev

Цитата:
тогда уж pushd \\server\folder\subfolder\%%i, если ты уверен, что папка subfolder\%%i существует.


точно сократил до следующего вида:
@echo off
for /f "tokens=2 delims==" %%i in ('wmic path win32_LocalTime get DayOfWeek /value') do (
pushd \\server\folder\subfolder\%%i
D:\folder\*.* /i /y
popd
)


ЕЩЕ раз СПАСИБО !!!
Автор: RaP1D
Дата сообщения: 04.04.2008 20:44
А как сделать следущее:
if (1 июня) выполняеться команда

То есть, запуск команды только, если сегодня 1 июня...
Автор: igor_andreev
Дата сообщения: 04.04.2008 20:51
RaP1D
От формата даты вообще зависит. Например, если у тебя DATE /T выдает сегодня 04.04.2008, то можно так:

Код:
DATE /T | FIND "01.06" && Тут твоя команда
Автор: RaP1D
Дата сообщения: 04.04.2008 21:01
igor_andreev
Спасибо!!!


Вопрос номер 2:
Можно ли узнать посредством командной строки имя компьютера админа (не пользователя)? Ip адрес известен...

Вопрос номер 3:
Как сделать тоже, что и с датой, но только для локального диска? Допустим, если размер диска D > 10000Mb, то выполняеться команда...
Автор: igor_andreev
Дата сообщения: 05.04.2008 11:30
RaP1D

Цитата:
Ip адрес известен...

В локальной сети что-ли? tracert ip или nbtstat -A ip

Цитата:
Допустим, если размер диска D > 10000Mb, то выполняеться команда...

А тут вроде кто-то уже определял свободное место на диске, посмотри в предыдущих ветках про батники в версии для печати. Я сам признаться никогда этим не заморачивался
Что-то вроде
for /f "skip=2 tokens=5 delims=: " %%a in ('fsutil volume diskfree d:') do set "free_space=%%a"
set free_space=%free_space:~0,6%
if /i %free_space% GTR 100000 тут команда
tokens от версии винды зависит ru\en, что там fsutil выдает. Или vbs можно.
Автор: Wise_Kaa
Дата сообщения: 05.04.2008 11:39

Цитата:
Вопрос номер 2:
Можно ли узнать посредством командной строки имя компьютера админа (не пользователя)? Ip адрес известен..

nbtstat -a ip-address (пример: nbtstat -a 192.168.1.2)

Цитата:
Вопрос номер 3:
Как сделать тоже, что и с датой, но только для локального диска? Допустим, если размер диска D > 10000Mb, то выполняеться команда...

Не знаю как через батник, я делал через "журналы и оповещения производительности", там можно запускать программу по какому либюо событию, например, когда места на диске меньше чем надо.

И у меня вопросик для знающих людей: как присвоить переменной размер файла? Что-то у меня никак не получается . Даже в теле цикла присваивание не происходит.

setlocal enabledelayedexpansion
for %%F in (*.*) do (
        echo %%F
        set razmer=%%~tF
        )
echo размер файла=%razmer%
pause
Автор: igor_andreev
Дата сообщения: 05.04.2008 12:04
Wise_Kaa

Цитата:
Даже в теле цикла присваивание не происходит.

Все происходит, каждый раз присваивается новое значение для каждого файла в папке. У тебя правда не размер, а время.
Автор: Wise_Kaa
Дата сообщения: 05.04.2008 12:20
Да, пардон, ошибся. Но не во времени суть.

setlocal enabledelayedexpansion
for %%F in (*.*) do (
echo %%F
set File_time=%%~tF
echo %File_time%
)
echo время создания последнего перебранного в цикле файла: %File_time%
pause

Вышеприведенный код выдает следующее:
echo off
время файла 123.cmd=
время файла slovar.txt=
время файла slovar2.txt=
время создания последнего перебранного в цикле файла: 01.02.2008 17:21
Для продолжения нажмите любую клавишу . . .

А как сделать, что бы знаечение времени присваивалось какой-то переменной в теле цикла?
просто выводить echo %%~tF , не подходит, потому что со временем надо производить некоторые манипуляции.
Автор: igor_andreev
Дата сообщения: 05.04.2008 12:39
Wise_Kaa
Ну если пробелов в названиях файлов нет, то можно к File_time_ добавлять имя-расширение файла

Код:
for %%a in (*.*) do set "File_time_%%~nxa=%%~ta"
echo 123.cmd %File_time_123.cmd%
echo slovar.txt %File_time_slovar.txt%
echo slovar2.txt %File_time_slovar2.txt%
Автор: Wise_Kaa
Дата сообщения: 05.04.2008 14:48
igor_andreev
Спасибо большое и извини, что напрягаю, но это не совсем то что надо, возможно я немного непонятно выразился.
Мне надо, что бы в теле цикла значение времени присвоилось переменной, потом в этом же цикле я мог это значчение как-то обработать.
Т.е. то-то типа

setlocal enabledelayedexpansion
for %%F in (*.*) do (
echo %%F
set File_time=%%~tF
if File_time==<сравниваемое значение> выводим сообщение
)
Автор: 01MDM
Дата сообщения: 05.04.2008 15:18
Wise_Kaa
Напиши что надо конкретно.
Если уж используешь "setlocal enabledelayedexpansion" (имхо - зло), то надо переменные в цикле или условии заключать в "!var!"


Код:
setlocal enabledelayedexpansion
for %%F in (*.*) do (
echo %%F
set File_time=%%~tF
if !File_time!==<сравниваемое значение> выводим сообщение
)
Автор: Nagual
Дата сообщения: 05.04.2008 15:50
Wise_Kaa, имхо проще заюзать forfiles
Автор: Wise_Kaa
Дата сообщения: 05.04.2008 16:09
Nagual
а что за forfiles?

01MDM
А почему "setlocal enabledelayedexpansion" зло?

Надо что бы в папке перебрались все файлы, и все файлы, которые были созданы раньше чем 20 минут назад были удалены, ну или не удалены, а еще что-нибудь там с ними было сделано, например, переименованы, не важно, еще и сам не решил .
Автор: king_stiven
Дата сообщения: 05.04.2008 16:28
Wise_Kaa

Код: for %%F in (*.*) do if "%%~tF"=="сравниваемое значение" выводим сообщение
Автор: igor_andreev
Дата сообщения: 05.04.2008 16:40
Wise_Kaa
Сравнивать время в батнике не очень эстетично Vbscript-ом гораздо легче, там есть гибкая функция DateDiff, пару строчек займет. Да и %~tF возвращает не время создания, а время последней модификации.


Добавлено:
Простой пример, timediff.vbs

Код:
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(WScript.Arguments.Item(0))
s = DateDiff("n", f.DateCreated, Now)
WScript.Quit (s)
Автор: Monaxmm
Дата сообщения: 05.04.2008 21:58
Вот маленкая прога

@Echo off
Set /p x=Если хотите удалить файли с расширением txt Введите у
echo Вы ввели:
echo %x%
if %x%==y del *.txt
pause

Задача: как сделать так чтоб при нажатии кнопки Enter удалять а при Esc, выход из програмы.
Как присвоить переменной х значения клавиши Enter?
Спасибо зарание...
Автор: Nagual
Дата сообщения: 06.04.2008 16:04
Monaxmm
используя скрипты
если хочешь сценарием, перефразируй вопрос и отвечай на него клавишами y (yes) и n (no)
например,
@echo off
title Удаление файлов *.txt
set /p "x=Для удаления файлов .txt нажмите Y, для выхода из программы, нажмите N "
echo Вы ввели: %x%
if /i %x%==y del *.txt
if /i %x%==n goto:eof
pause
или
@echo off
title Удаление файлов *.txt
set /p "x=Для удаления файлов .txt нажмите Y, для выхода из программы, нажмите любую клавишу "
echo Вы ввели: %x%
if /i %x%==y del *.txt else goto:eof
pause
Автор: Monaxmm
Дата сообщения: 06.04.2008 16:46
В первую очередь: Спасибо за ответ на вопрос!
Хочу сделать тоже самое только чтобы вместо у и n, было клавиша Enter и Esc.
Возможно ли ето? Или нет ризона парится по пустякам?
Автор: Nagual
Дата сообщения: 06.04.2008 17:27
Monaxmm
повторяю, используя скрипты (гибридный сценарий)
мне лично писать такое лень, т.к. код представляет малый интерес
в принципе, клавишу Enter можно использовать как любую, остается скриптом обработать клавищу Ecs

пример кода на js

Код:
W=WScript.CreateObject("WScript.Shell")
W.SendKeys("~") // клавиша Enter
W.SendKeys("{ESC}") // клавиша Escape

на vbs выглядит так

Код:
Set W=CreateObject("WScript.Shell")
W.SendKeys "{ESC}" ' клавиша Escape
W.SendKeys "~" ' клавиша Enter

ищи примеры в сети
а вообще, резона париться по пустякам нет
Автор: Monaxmm
Дата сообщения: 06.04.2008 19:22
Спасибо!
Автор: ja_ja
Дата сообщения: 07.04.2008 13:50
Много искал но не нашел ничего, по этому решил спросить.

Есть класс 15 PC, еще один комп для учителя. домена нет, есть только локальная сеть. Так вот в этом классе надо для 15 компов на диске D: создать папку students, когда ученики поработают и в этой папке запишут свои файлы и папки, их надо удалить и подготовить чистую папку для другого класса, D:\students но с правами доступа и записи для лимитированного юзера student.

Часть проблемы я решил. Написал следующее:

net use \\192.168.1.12\IPC$ /User:Administrator password – вхожу с правами админа
rd /S /Q \\192.168.1.12\d$\student - удаляю папку
mkdir \\192.168.1.12\d$\student - создаю папку

Ну и повторяю этот цикл 15 раз для разных IP. Запускаю батник с компа учителя.
Проблема в том что из 15 компов на пяти создается папка D:\students с правами Administrator (вообще-то это так и должно быть, но почему 10 компов разрешают создавать папку с правами доступа student? не понимаю), ну и ясно юзер student не может открыть, тем более записать в него нечего не может.

Пробовал добавить:
cacls \\192.168.1.12\d$\student /t /e /g student:f - полный доступ пользователя student

Но не помогает, cacls на локальном компе всё делает правильно, но в сетке права папке не выставляет для указанного юзера, добавляет непонятного юзера с полными правами и то в том случае если на компе учителя создам юзера student.

Если спросите почему не использую del (зачем всю папку удалять, потом создавать и мучится с правами) то скажу что оно не удаляет подкаталоги, которые создают ученики.

В общем нужна помощь, как с помощью батника задать права на папку конкретному юзеру (на той машине) на удаленном локальном компьютере, который не находится в домене.
Автор: king_stiven
Дата сообщения: 07.04.2008 16:15
ja_ja

PushD
RD /s /q .
PopD
пути нужные вставить
Автор: slayer120
Дата сообщения: 07.04.2008 16:17

sipok

Цитата:
Значит - либо ставь на конце значок \,
xcopy /i /Y f:\folder\*.* B:\%%i\
либо юзай /i

Слушай, я сам лажанулся:
первый способ (
xcopy /Y f:\folder\*.* B:\%%i\ - без /i - на конце косуха обязательно

второй с /i

xcopy /i /Y f:\folder\*.* B:\%%i - здесь последняя косуха не нужна.
оба способа рабочие 100 %.

Автор: ja_ja
Дата сообщения: 07.04.2008 18:24
king_stiven

Огромное человеческое спасибо.

Неделю мучился, как раз думал как-то примоунтит папку но никак до ума довести не мог.

Кстати команда RD /s /q . после выполнения пишет:

The process cannot access the file because it is being used by another process.

но свое дело делает.

P.S. пришлось чуть-чуть подправить батник, ото прямая команда
RD /s /q .
в случае не нахождения пути (из предыдущей команды)
PushD \\192.168.1.12\d$\student
(например сеть временно отсоединена, или из за чего-то еще)
удаляет сам себя и все файлы которые находятся вместе с ним в одной директории. хохма
Автор: igor_andreev
Дата сообщения: 08.04.2008 04:15
ja_ja

Цитата:
(например сеть временно отсоединена, или из за чего-то еще)
удаляет сам себя и все файлы которые находятся вместе с ним в одной директории. хохма

Почитай две предыдущие страницы этого топика хотя бы. После pushd желательно делать проверку кода возврата, если pushd отработало удачно, он будет равен нулю.

Код:
pushd \\server\share
if not errorlevel 1 тут твоя команда
Автор: ZloyBehemoth
Дата сообщения: 08.04.2008 06:34
Не подскажите как из комстроки найти на диске по имени файлы и заменить их на другие файлы (заранее заготовленные)?
Автор: king_stiven
Дата сообщения: 08.04.2008 08:32
ZloyBehemoth

Код: FOR /R %c IN ("имя файла.*") DO (
del %c
xcopy "нужный файл" "%~dpc"
)
Автор: ja_ja
Дата сообщения: 08.04.2008 09:29
igor_andreev

Спасибо учту
Автор: ZloyBehemoth
Дата сообщения: 08.04.2008 10:57

Цитата:
Код:
FOR /R %c IN ("имя файла.*") DO (
del %c
xcopy "нужный файл" "%~dpc"
)


Не получается. Говорит "непредвиденное появление IN".
После того как заменил % на %% батник заработал, но "нужный файл" копируется во все директории, вне зависимости был там "имя файла.*" или нет.
Автор: king_stiven
Дата сообщения: 08.04.2008 13:54
ZloyBehemoth
поставь в конец батника pause, запусти батник, скопируй и выложи здесь. Попробуй 2 пример.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Сброс пароля администратора


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