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

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

Автор: wolf0425
Дата сообщения: 23.12.2010 01:17
как бы скопировать дерево каталогов вместе со всеми назначенными правами на папки?
файлы в дереве копировать НЕ нужно...
Автор: BVV63
Дата сообщения: 23.12.2010 04:39
wolf0425
XCopy ... /T /O
Копирует структуру папок и сохраняет их владельца и разрешения. Файлы не копируются.
Автор: Vladins
Дата сообщения: 23.12.2010 17:55
king_stiven
Архивирует подряд все dwg файлы...
Автор: king_stiven
Дата сообщения: 23.12.2010 20:09
Vladins

такой код у меня работает
for /f "delims=" %%i in ('dir /O:D /T:W /a:-d /b *.dwg') do (
copy "%%i" "D:\temp"
exit
)
Автор: Vladins
Дата сообщения: 23.12.2010 23:11
king_stiven Работает. Благодарю
Автор: vbrv
Дата сообщения: 24.12.2010 09:14
Rush, спасибо за помощь.

Помогите допилить скрипт.
Нашёл пример генерации пароля.

Код: @echo off
setlocal

for /l %%i in (1,1,32) do (
for %%i in (a,b,c,d,e,f,0,1,2,3,4,5,6,7,8,9) do call:set %%i
for /f "tokens=3 delims=_=" %%i in ('set sign_') do set "str=%%i"
call:string
)

echo %string%

goto:eof

:set
set "sign_%random%=%1"
goto:eof

:string
set "string=%string%%str%"
for /f "tokens=1 delims==" %%i in ('set sign_') do set "%%i="
Автор: res2001
Дата сообщения: 24.12.2010 09:46
vbrv

Цитата:
как это перевести в функцию, для вызова из цикла.

Видимо так:

Код: @echo off
FOR /F "tokens=*" %%a in (list.txt) do (
call:getpass
7z a -t7z -mx5 -p%string% %%a.7z %%a*
)
goto:eof

:getpass
for /l %%i in (1,1,32) do (
for %%j in (a,b,c,d,e,f,0,1,2,3,4,5,6,7,8,9) do call:set %%j
for /f "tokens=3 delims=_=" %%j in ('set sign_') do set "str=%%j"
call:string
)
echo.%string%
exit /b

:set
set "sign_%random%=%1"
exit /b

:string
set "string=%string%%str%"
for /f "tokens=1 delims==" %%j in ('set sign_') do set "%%j="
exit /b
Автор: vbrv
Дата сообщения: 24.12.2010 12:19
Не правильно работает.
Для теста заменил 7z на вывод в консоль:

Код: @echo off

for /l %%z in (1,1,3) do (
call:getpass
echo %string%
)
goto:eof

:getpass
for /l %%i in (1,1,32) do (
for %%j in (a,b,c,d,e,f,0,1,2,3,4,5,6,7,8,9) do call:set %%j
for /f "tokens=3 delims=_=" %%j in ('set sign_') do set "str=%%j"
call:string
)
echo.%string%
exit /b

:set
set "sign_%random%=%1"
exit /b

:string
set "string=%string%%str%"
for /f "tokens=1 delims==" %%j in ('set sign_') do set "%%j="
exit /b
Автор: res2001
Дата сообщения: 24.12.2010 12:48
vbrv

Цитата:
Не правильно работает.

В чем неправильность? Я у себя тестировал - работает.


Цитата:
Хотелось бы этот бат файл вызывать из основного батника и соответственно получать из него сгенерированный пароль.

Ну и вызывай:
for /f "skip=4 tokens=*" %%a in ('MAKEPASS.CMD') do set pass=%%a
Автор: vbrv
Дата сообщения: 24.12.2010 22:23
res2001

Цитата:
В чем неправильность? Я у себя тестировал - работает.

После каждой итерации цикла новый пароль дописыватся к старому.
Надо как-то обнулять переменную string.
Даже после выхода из батника и запуска его вновь, новый пароль добавляется к концу пароля из прошлой отработки батника.
1 итерация: pass=12
2 итерация: pass=1234
3 итерация: pass=123456
выход из батника и его повторный запуск:
pass=12345678
.....


Цитата:
for /f "skip=4 tokens=*" %%a in ('MAKEPASS.CMD') do set pass=%%a

Спасибо, работает, только поправил skip=5
Здесь тоже переменная не обнуляется после выхода из батника.


Код: @echo off
for /f "skip=5 tokens=*" %%a in ('MAKEPASS.CMD') do (
set %pass%=%%a
echo %pass%
)
Автор: wolf0425
Дата сообщения: 24.12.2010 23:35

Цитата:
затупил
"set %pass%=%%a", pass надо без %% писать.

ещё затупил в
Код: do (
set pass=%%a
echo %pass%
)
Автор: vbrv
Дата сообщения: 24.12.2010 23:55

Цитата:
или будешь иметь печать того %pass% что был до вызова for

Спасибо, правда непонятно почему так будет.

С похожей ситуацией справиться не могу.

Код: @echo off
setlocal enabledelayedexpansion

for /l %%z in (1,1,3) do (
for /f "skip=5 tokens=*" %%a in ('MAKEPASS.CMD') do set pass=%%a
@echo !pass!
)
Автор: wolf0425
Дата сообщения: 25.12.2010 00:38

Цитата:
Спасибо, правда непонятно почему так будет.
потому что все %переменные% в операторе for (включая те что в do) будут заменены на значения ещё в момент разбора интерпретатором команды - до начала выполнения for
плюс полностью аналогичная ситуация с операторами в (скобках), которые тоже препроцессятся целиком - а у тебя там и скобки и for разом


Цитата:
С похожей ситуацией справиться не могу.
btw, текст MAKEPASS.CMD приведи...
но скорее всего тут ситуация не похожая, а совсем другая - типа попадало на фиговую рандомность %random% при последовательных вызовах батника.
Автор: vbrv
Дата сообщения: 25.12.2010 00:42

Код: @echo off & setlocal enableextensions enabledelayedexpansion

rem This script file is part of the following collection:
rem ftp://garbo.uwasa.fi/pc/link/tscmd.zip
rem http://garbo.uwasa.fi/pub/pc/link/tscmd.zip
rem Useful NT/2000/XP script tricks and tips, T.Salmi
rem Please do not distribute separately from that package.
rem
rem Also see http://www.netikka.net/tsneti/info/tscmd.php
rem for an HTML version of Assorted NT/2000/XP/.. CMD.EXE Script Tricks

echo.
echo ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
echo і MAKEPASS.CMD Make a randomized password і
echo і By Prof. Timo Salmi, Last modified Tue 2-Feb-2010 і
echo АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
echo.

:: Is help asked for
if "%~1"=="?" goto _help
if "%~1"=="/?" goto _help

:: Set your desired password length
set PasswordLength=10

:: The character set to be drawn from
set chars=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#/()=+-,.;:_*'
rem 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
rem echo %chars%
rem echo 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234567

:: Requirements on the password
if "%~1"=="" set MaxChar=76
if "%~1"=="/1" set MaxChar=25
if "%~1"=="/2" set MaxChar=51
if "%~1"=="/3" (
set MaxChar=61
set RequireNumber=true
)
if "%~1"=="/4" (
set MaxChar=76
set RequireNumber=true
set RequireSpecial=true
)

:: Build the password
:_again
set result_=
for /L %%i in (1,1,%passwordLength%) do (
call :GetOneRandomChar %MaxChar% rndchr_
set result_=!result_!!rndchr_!
)

:: Are the requirements met?
echo %result_%|findstr "[0123456789]">nul
if %errorlevel% EQU 0 set FoundNumber=true
echo %result_%|findstr "[@#/()=+-,.;:_*']">nul
if %errorlevel% EQU 0 set FoundSpecial=true
if defined RequireNumber if not defined FoundNumber goto _again
if defined RequireSpecial if not defined FoundSpecial goto _again

:: Display the resulting random password
echo %result_%
goto _out

:_help
echo Usage: MAKEPASS [/Choiceі/?]
echo.
echo /1 only lower-case letters
echo /2 only letters
echo /3 require at least one number
echo /4 require at least one number and one special character
echo None: No preference
goto _out

:_out
if not defined cmdbox if defined PauseIfFromDesktop pause
endlocal & goto :EOF

:: ============================================================
: GetOneRandomChar MaxChar
setlocal enableextensions enabledelayedexpansion
set /a div_=32767 / %1
set /a rand_=%random% / %div_%
set return_=!chars:~%rand_%,1!
endlocal & set "%2=%return_%" & goto :EOF
Автор: wolf0425
Дата сообщения: 25.12.2010 08:05
vbrv угу, это именно глюки %random% который повторяется если его часто пересбрасывать.
впиши ping localhost -n 2 >nul в начало MAKEPASS.CMD (или в for между вызовами) - это затянет каждую генерацию на секунду, но зато все пароли будут разные.

ну или засовывай код MAKEPASS.CMD в свой батник и переписывай чтоб был вызов без запуска нового cmd
Автор: pav461
Дата сообщения: 25.12.2010 10:33
Помогите, пожалуйста с bat файлом. Текст задания:
Вывести на экран монитора квадрат наименьшего из значений трех параметров а1, а2, а3 или сообщение "Параметры равны", если значения параметров равны.
Автор: 01MDM
Дата сообщения: 25.12.2010 11:50
pav461
Домашка?

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

if %1==%2 (if %2==%3 echo Параметры равны && goto:eof)

set "param=%1"
for %%i in (%*) do if %%i leq !param! set "param=%%i"

for /l %%i in (0,1,%param%) do (
    
    set /a test=%%i*%%i
    if !test! leq %param% set "sqrt=%%i"

)

echo %sqrt%
Автор: pav461
Дата сообщения: 25.12.2010 12:11
01MDM, спасибо. Да, домашка, за неделю до нового года мозг отказался делать последнюю лабу...
Автор: wolf0425
Дата сообщения: 25.12.2010 13:40
01MDM, в задаче просили квадрат наименьшего, а не квадратный корень из наименьшего
Автор: 01MDM
Дата сообщения: 25.12.2010 14:13
А я еще подумал, что какое-то сложное для cmd задание. Ну я вижу парень грамотный, подправит..
Автор: Lamman
Дата сообщения: 26.12.2010 13:20
wolf0425
res2001

Спасибо!

Упростил схему распределения переменных.
Заработало... Их распределение.

Заодно вспомнил, почему я ещё при первом преближении отсеял такой сценакрий как неработающий.
Это же текстовые строки 02, 09 и т.д., а не числа.
Так что обрабатывать их нужно как текстовые строки, либо писать на чём-нибудь ещё.

[лирическое отступление]
Скрипты предложенные представляют интерес... Хотелось бы только по vbs'у какой-нибудь учебник что ли... Мне лично для понимания больше всего подходят "классические университетсвие"... Не подскажет кто-нибудь, какую-нибудь содержательную книгу в этой связи?..
[/лирическое отступление]

На avtoIt'е такая процедура занимает буквально пару строк и используется во всех тривиальных "загрузчиках" программ, проявляющих интерес к дате...
Автор: wolf0425
Дата сообщения: 26.12.2010 15:02

Цитата:
На avtoIt'е такая процедура занимает буквально пару строк и используется во всех тривиальных "загрузчиках" программ, проявляющих интерес к дате...

ну так и на vbs это занимает строку из двух операторов, плюс ещё оператор и строка создание vbs и его вызов...
не изобретай велосипед

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

Автор: Lamman
Дата сообщения: 26.12.2010 16:02
pav461

Сравнение можно провести ещё как-нибудь так:


Код: if %a1% leq %a2% (set num=%a1%) else (set num=%a2%)
if %num% leq %a3% (set x=%num%) else (set x=%a3%)
set /a "%sq%=x*x"
Автор: 01MDM
Дата сообщения: 26.12.2010 22:45
Lamman,
Я просто ошибся с заданием

Я, думаю можно, но заморачиваться не стоит. Вот ~приблизительное, неторопливое псевдорешение:

Код:
@echo off
setlocal enabledelayedexpansion

echo %time%
set "n=%1"

for /l %%i in (0,1,%n%00000) do (

    set /a test=%%i*%%i
    if !test! leq %n%0000 (set "sqrt=%%i") else (goto:echo)

)

:echo
echo %sqrt:~0,-2%.%sqrt:~-2%
echo %time%

:: И проверка:
powershell -c [math]::sqrt(%n%)
Автор: king_stiven
Дата сообщения: 28.12.2010 00:10
У клавиш стрелок есть коды, чтоб эмулировать нажатие?
Автор: bomzzz
Дата сообщения: 28.12.2010 00:26
есть. но батники кодами не орудуют
Автор: king_stiven
Дата сообщения: 28.12.2010 00:45
bomzzz
nircmd выручила
Автор: bomzzz
Дата сообщения: 28.12.2010 00:50
я макрорекордером пользуюсь может подошел бы для твоего задания

Добавлено:
Easy Macro Recorder
Автор: Lamman
Дата сообщения: 28.12.2010 12:57
Изящно.

Вот ещё вопрос. Где-то я что-то упустил.

Код: @echo off
rem Семь "случайных" чисел диопазона 0-4, причём последние три не могут быть равны друг-другу.
:gen
set /a str1= %random% %% 5
set /a str2= %random% %% 5
set /a str3= %random% %% 5
set /a str4= %random% %% 5
set /a str5= %random% %% 5

set /a bl1= %random% %% 5
:bla2
set /a bl2= %random% %% 5
if not bl2 neq bl1 (call:bla2 "bl1")
:bla3
set /a bl3= %random% %% 5
if not bl3 neq bl2 (call:bla3 "bl1 bl2")
if not bl3 neq bl1 (call:bla3 "bl1 bl2") else (call:result "bl1 bl2 bl3")
:result
@echo %str1% %str2% %str3% %str4% %str5% %bl1% %bl2% %bl3%
pause >nul
goto gen
Автор: VXC
Дата сообщения: 28.12.2010 13:46
Подскажите пожалуйста как такое реализовать.
Есть директория в которой лежат файлы *.mp4 Имена совершенно произвольные.
Как прочитать содержимое директории и передать имена в качестве параметров консольной утилите.
То есть считать имена всех файлов в папке и передать их по очереди в экзешник в качестве параметра.
fools.exe filename.mp4

Спасибо.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Windows 7 Starter


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