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

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

Автор: vitaliy91
Дата сообщения: 29.10.2010 15:01
Accessor
Я все прекрастно понимаю
Последняя версия MS-DOS 6.22 после которой идут PC-DOS 7.0, 7.1 из win95 и PC-DOS 8.0 из win98
Версия на скриншоте это патченный PC-DOS 8.0 который может запускаться под win и работает он точно также как например с дискеты.
errorlevel можно проверить и из командной строки для этого я использовал errorlvl.exe который устанавливает определенный код возврата

Автор: wolf0425
Дата сообщения: 29.10.2010 15:29

Цитата:
Наверное она создаётся в момент запуска пакетного файла. Будем знать.

она вообще не создается.
предоставляемые cmd.exe пседвопеременные %errorlevel% %time% %date% %random% и т.п. заменяются на свои текущие значения в момент парсинга строк, которые их содержат - точно так же как и обычные переменные.
А вот наличие таких переменных в выводе set - говорит лишь о том, что пользователь сам зачем-то определил одноименные переменные, за их значения отвечает сам и cmd за их значения больше не отвечает.

а в ДОСе подобной фишки не было, как и многих других привычных на win2000+ фишек - command.com весьма убог по возможностям. И всякие клоны ДОСа - тоже недалеко от него ушли.
Автор: Accessor
Дата сообщения: 29.10.2010 16:13
vitaliy91
Беру свои слова обратно. Только что не поленился, загрузился в доску и на собственной шкуре убедился, что команда "cd" не имеет errorlevel, и команда if в доске упрощена - в ней отрезана ветка else. Ещё раз прошу прощения.
Автор: smirnvlad
Дата сообщения: 29.10.2010 16:40
vitaliy91
наличие диска всегда можно проверить
if exist b:\nul goto :bexist

exit
а если уж он есть то и перейти на него можно

:bexist
b:
cd
Автор: vitaliy91
Дата сообщения: 29.10.2010 18:08


Под win работает и можно сократить
if exist A: echo exist
Автор: lorents
Дата сообщения: 29.10.2010 20:32
Добрый вечер!
Помогите, пожалуйста, решить следующую задачу:

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    truepng /i0 /zw7 /zc9 /zm1-9 /zs0-3 /fe /force "%%~fi" >nul
    pngout -q -ks "%%~fi"
)
Автор: 01MDM
Дата сообщения: 29.10.2010 20:46
lorents
Надо еще один цикл запускать.

Код:
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
truepng /i0 /zw7 /zc9 /zm1-9 /zs0-3 /fe /force "%%~fi" >nul
pngout -q -ks "%%~fi"
for %%j in ("%%~fi") do echo %%~zj
)
Автор: lorents
Дата сообщения: 29.10.2010 20:51
01MDM
отличная идея, спасибо

Добавлено:

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    truepng /i0 /zw7 /zc9 /zm1-9 /zs0-3 /fe /force "%%~fi" >nul
    for %%k in ("%%~fi") do echo %%~zk >nul
    pngout -q -ks "%%~fi"
    for %%l in ("%%~fi") do echo %%~zl >nul
    if !%%~zk! EQU !%%~zl! (
        for /l %%m in (0,1,5) do pngout -q -s3 -ks -f%%m "%%~fi"
        for /l %%n in (0,1,64) do pngout -q -s3 -ks -n%%n "%%~fi"
    )

    pause
)
Автор: 01MDM
Дата сообщения: 29.10.2010 21:46
lorents
Тебе надо сравнить размеры до обработки и после?

Код:
@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (

truepng /i0 /zw7 /zc9 /zm1-9 /zs0-3 /fe /force "%%~fi" >nul
for %%k in ("%%~fi") do set "size-1=%%~zk"
pngout -q -ks "%%~fi"
for %%l in ("%%~fi") do set "size-2=%%~zl"

if !size-1! EQU !size-2! (

for /l %%m in (0,1,5) do pngout -q -s3 -ks -f%%m "%%~fi"
for /l %%n in (0,1,64) do pngout -q -s3 -ks -n%%n "%%~fi"
)

pause

)
Автор: king_stiven
Дата сообщения: 29.10.2010 21:52

гм...
Автор: lorents
Дата сообщения: 29.10.2010 22:00
01MDM
Все работает, большое спасибо
Автор: BorlandIMHO
Дата сообщения: 29.10.2010 22:06
smirnvlad
vitaliy91

При проверке по условию if exist проблема будет со съёмными дисками - если буква есть, а диска в дисководе нет, выдаст ошибку "Устройство не готово" и спросит что делать дальше - (A)bort, (R)etry, (F)ail; и пока не ответишь - будет висеть. В остальном работает.
Но, в общем-то, такая же ошибка возникнет при обращении к "неготовому" диску любой командой (cd, copy...).
Кстати, практически такая же засада в общем-то возникнет и в любой винде (опробовано в хрени и в свисте) - с той разницей что окошко выдаст гуёвое...
Автор: vitaliy91
Дата сообщения: 29.10.2010 22:25
BorlandIMHO
Спасибо за пример. Он действительно работает и я испольую 8 версию доса потому что там нет таких проблем с неподготовленным оборудованием и все хоро отрабатывается

Добавлено:
И такой вопрос. Как можно реализовать в чистом досе do begin чтобы при условии отрабатывалось несколько строк
например:
if i==true (
echo ok
echo.
)

Но скобки в чистом досе не будут работать.
Автор: 01MDM
Дата сообщения: 29.10.2010 22:51
vitaliy91

Код:
if i==true call: sub
goto eof

:sub
echo Ok
echo.

:eof
Автор: BorlandIMHO
Дата сообщения: 29.10.2010 22:53

Цитата:
Как можно реализовать в чистом досе do begin чтобы при условии отрабатывалось несколько строк

Только по goto либо выносом этих нескольких строк в отдельный батник...


Код: SET VARIABLE=ЗНАЧЕНИЕ
if "%VARIABLE%"=="ЗНАЧЕНИЕ" goto TRUE
REM здесь, соответственно, не TRUE
echo ни разу
echo не равно
goto CONTINUE

:TRUE
echo один раз
echo равно

:CONTINUE

echo проверко завершено!!!
exit
Автор: 01MDM
Дата сообщения: 29.10.2010 23:02
BorlandIMHO

Цитата:
в голом ДОСе не работает. call может вызвать только внешний батник...


Тогда, да, goto. Вроде в 4dos можно было использовать call на метку.
Автор: vitaliy91
Дата сообщения: 29.10.2010 23:33
BorlandIMHO
01MDM

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

SET curDir=%CD% в чистом досе не сработает
Автор: OnePrg
Дата сообщения: 30.10.2010 16:14
Камрады! Втупил я: долго рассказывать, ну в общем я в типах файлов создал новый тип BAT и назначил ему программку-редактор (!). Теперь батники не выполняются, а просто открываются для редактирования. Как вернуть всё обратно? Спасибо.
Автор: 01MDM
Дата сообщения: 30.10.2010 16:30
OnePrg
выполни в cmd:

Код:
assoc .bat=batfile
ftype batfile="%1" %*
Автор: wolf0425
Дата сообщения: 31.10.2010 21:14
в xml есть вложенный файл (<binary content-type="image/jpg" .* =</binary>)

1. как батником его извлечь?
2. как его заменить другим?
в смысле - чем раскодировать/закодировать?
Автор: igor_andreev
Дата сообщения: 01.11.2010 02:37
wolf0425
1) Можно записать всё, что между тегами <binary> во временный файл(sed напр.) и потом декодировать при помощи Base64.exe(в "полезных утилитах" в шапке)
base64 -d input.tmp output.jpg
2) base64 -e input.jpg output.tmp и этот output.tmp вставить уже между тегами <binary>
Автор: pandora777
Дата сообщения: 01.11.2010 13:05
Такой вопрос. Батником делается ежедневный архив. Как добавить удаление старых архивов, например, которые старше 2 месяцев? Заранее спасибо.
Автор: marakshin
Дата сообщения: 01.11.2010 13:42
Вопрос: Имеется ли возможность изменить раскладку по умолчанию через интерфейс командной строки (через reg add не катит, потому что не применяется сразу).
Объясню зачем: При подключении через UltraVNC, если у пользователя стоит раскладка по умолчанию: Русская, то возникают проблемы с переключением, если же Англицкая - то все нормально.
Спасибо.
Автор: wolf0425
Дата сообщения: 01.11.2010 15:19

Цитата:
Как добавить удаление старых архивов, например, которые старше 2 месяцев? Заранее спасибо.

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

а если подойдет удалить просто все архивы кроме например последних 5 то типа так:

Код: @echo off
pushd "c:\archive" && for /f "skip=5 delims=" %%a in (' @dir /b /o-d *.zip ') do echo del "%%~a"
Автор: ArtyBrest
Дата сообщения: 01.11.2010 16:10
День добрый всем.

Имеется два каталога с файлами в них:

Код: masks\
mask0385.png
mask0386.png
mask0387.png
diffuse\
w0385.bmp
w0386.bmp
w0387.bmp
Автор: wolf0425
Дата сообщения: 01.11.2010 16:34

Цитата:
Имена файлов неизвестны (могут отличаться от указанных, но всегда идут по порядку)
ты лучше скажи - совпадение циферок у имен - это закономерность или получилось случайно, и есть пары в которых такого совпадения нет?

если первый вариант - то проще парой подстановок преобразовать первое имя во второе,
если второй вариант (что нужно именно совпадение по порядку, а не по сходству имени) - то как ты написал, во внешнем цикле тикает счетчик и вызывается саб со вторым циклом, в том - скипается нужное количество файлов второго каталога...
действия, кстати, проще выполнять в том же вложенном цикле, никаких промежуточных переменных не плодя.
Автор: ArtyBrest
Дата сообщения: 01.11.2010 16:43
wolf0425

Цитата:
ты лучше скажи - совпадение циферок у имен - это закономерность или получилось случайно, и есть пары в которых такого совпадения нет?

да, в конце имени всегда четыре цифры и файлы с одинаковыми числами образуют пары.
Автор: wolf0425
Дата сообщения: 01.11.2010 17:17

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

код для печати пар для имен из вышепериведенного примера:

Код: for %%a in ( masks\*.png ) do call :_proc "%%~a"
exit

:_proc
set "_number=%~n1"
set "_number=%_number:mask=%"
echo "%~1" "diffuse\w%_number%.bmp"
exit /b
Автор: ArtyBrest
Дата сообщения: 01.11.2010 17:28
wolf0425
Спасибо.

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

Примерно что-то такое и сделал, только скопировать сюда не могу, т.к. будет выдрано из контекста здоровенного файла .
Автор: king_stiven
Дата сообщения: 01.11.2010 19:54

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

for %%a in (masks\*) do (
set a=%%a
set b=%%~na
call :fgh1
)
pause
:fgh1
for %%c in (diffuse\*%b:~-4%.*) do echo %a% %%c

Добавлено:
то же самое

for %%a in (masks\*) do call :fgh1 "%%a" "%%~na"
pause
:fgh1
set "b=%~2"
for %%c in (diffuse\*%b:~-4%.*) do echo %1 %%c

Добавлено:
Но почему и в этом варианте %%a срабатывает, мне непонятно.
Код: for %%a in (masks\*) do call :fgh1 "%%~na"
pause
:fgh1
set "b=%~1"
for %%c in (diffuse\*%b:~-4%.*) do echo %%a %%c

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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