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

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

Автор: primet
Дата сообщения: 29.11.2007 10:42
Nagual

Цитата:
Код:
@echo off
for /f "delims=" %%a in ('forfiles/s /d -10') do del/q/f/s %%a

Подскажите пожалуйста что значит команда forfiles
у меня при запуске данного батника ругается на нее.
Автор: NIKZZZZ
Дата сообщения: 29.11.2007 10:46
SapSat

Цитата:
спотыкается на первом же спец-символе, например -
если ввести <>

Задача решается либо заменой:

Код: set "temp=%s:<=z%"
set "temp=%s:>=z%"
Автор: primet
Дата сообщения: 29.11.2007 10:50

Цитата:
Код:
@echo off
for /f "delims=" %%a in ('forfiles/s /d -10') do del/q/f/s %%a

Подскажите пожалуйста что значит команда forfiles
у меня при запуске данного батника ругается на нее.
Автор: SapSat
Дата сообщения: 29.11.2007 11:07
NIKZZZZ

Нет, так задача не решается...
Остается проблема с символом "

Мой последний код - более универсальный...

.
Автор: 01MDM
Дата сообщения: 29.11.2007 12:10
primet
http://www.dynawell.com/reskit/microsoft/win2000/forfiles.zip

Добавлено:
SapSat
Строку можно "взвесить" с помощью временного файла

Код:
@echo off
for /f "tokens=*" %%1 in (1.txt) do (
echo %%1>1.tmp
for /f "tokens=*" %%2 in ('dir /b 1.tmp') do (
set /a len=%%~z2-2
)
)
del 1.tmp
echo %len%
Автор: primet
Дата сообщения: 29.11.2007 13:08
01MDM
Вери Биг Сенкс!
Автор: SapSat
Дата сообщения: 29.11.2007 15:51
01MDM

Да - спасибо 01MDM - это интересная мысль для получения ДЛИНЫ СТРОКИ или ПЕРЕМЕННОЙ - записать переменную в файл и далее просто замерять размер этого файла в байтах, типа

@echo off
set /p s=Enter string :
echo %s% >f
for /f %%i in ('dir /b f') do set /a l=%%~zi-3
del f & echo %l%

Только вопрос - как здесь побороть символ >
?

И почему я не могу просто написать
for /f %%i in (f) do set /a l=%%~zi-3

?
Автор: 01MDM
Дата сообщения: 29.11.2007 17:16
SapSat

Код:
@echo off
set /p s="Enter string : "
for /f "tokens=*" %%i in ("%s%") do echo %%i>f
for /f %%i in ('dir /b f') do set /a l=%%~zi-2
del f & echo %l%
Автор: Elroir
Дата сообщения: 30.11.2007 03:57
SapSat
01MDM
Почему бы не использовать for без ключа /f?

Код:
for %%i in (f) do set /a l=%%~zi-3
Автор: 01MDM
Дата сообщения: 30.11.2007 08:28
Elroir
Возможно решить?

Код:
set "line=!%"
echo %line%
Автор: SapSat
Дата сообщения: 30.11.2007 08:49
01MDM
Возможно решить?

Конечно - все решается...
А что ты хочешь получить на выходе?
Чтобы выдалось !%
?

Тогда пиши просто:

set line=!%%
echo %line%

На выходе:

!%

.
Автор: 01MDM
Дата сообщения: 30.11.2007 09:28
SapSat
Нет, это не решение. Дана переменная line, равная !%, ну или %!, или "abc !% cba", нужно ее вывести в консоль. Если переменная равна !%%, значит надо показать !%%.
Автор: SapSat
Дата сообщения: 30.11.2007 09:42
01MDM

Так переменная и есть !%

Просто для того, чтобы переменная была равна !%
надо добавить второй знак процента !%%

Если хочешь, чтобы переменная была !%%
то ее надо задавать как !%%%%

итд.
Автор: 01MDM
Дата сообщения: 30.11.2007 10:19
SapSat
А если эта переменная берется от куда-либо, т.е она динамическая? Переменная потому так и называется, что ты заранее не знаешь ее значение.
Автор: SapSat
Дата сообщения: 30.11.2007 11:51
01MDM
Так то-то и оно, что тогда вообще все ОК.

Если "эта переменная берется от куда-либо", то есть когда она равна !%
и идет откуда-то и куда-то, то она так и идет в виде !%
Например - введи здесь !%

@echo off
set /p s=Enter string :
set line=%s%
::set line=!%%
echo %line%
echo %line% >111

и это значение так и будет ходить (и выходить) в том же виде !%

Когда же ты ее значение определяешь через set
то тогда и надо добавлять второй знак процента.

Еще вопросы?
Автор: 01MDM
Дата сообщения: 30.11.2007 12:01
SapSat


Цитата:

@echo off
set /p s=Enter string :
set line=%s%
::set line=!%%
echo %line%


Не возвращает !, строку вводил aaa ! bbb %

Возвращает... Консоль была запущена через батник и не вышла из setlocal
Автор: SapSat
Дата сообщения: 30.11.2007 12:07
01MDM
Не возвращает !, строку вводил aaa ! bbb %

А у меня возвращает - и в консоль, и в файл
aaa ! bbb %
(все 11 символов)

....
Автор: 01MDM
Дата сообщения: 30.11.2007 12:15
SapSat
А так нет

Код:
@echo off
set "s=! aaa % bbb"
set line=%s%
echo %line%
Автор: SapSat
Дата сообщения: 30.11.2007 12:34

Ну так я же и говорю - когда ты определяешь значение переменной сам, то пиши:
set "s=! aaa %% bbb"

(дублируй знак процента).

Если же это значение ! aaa % bbb формируется где-то динамически, то оно будет гулять в вправильном виде.

.
Автор: 01MDM
Дата сообщения: 30.11.2007 13:34
SapSat

Все получилось, вся загвоздка была в setlocal enabledelayedexpansion, который я ставил вверху батника

Код:
@echo off
for /f "tokens=*" %%i in (1.txt) do (
    set "line=%%i" && call:parsing
    echo.
)
goto:eof

:parsing
setlocal enabledelayedexpansion
set count=0

:next
set /p=!line:~%count%,1!<nul
set /a count+=1
ping -n 1 localhost >nul
if not "!line:~%count%,1!"=="" goto:next
Автор: Elroir
Дата сообщения: 30.11.2007 13:52
01MDM
Знак процента в батниках служебный - это ни для кого не секрет. Как выполняется батник?
Правильно - cmd формирует новую строчку команды, в соответствии с тем, что написано в файле (подставляет переменные и т.д.) и запускает ее. То есть, если в батнике есть строчка set "s=%", cmd берет эту строчку, пытается туда подставить переменную (если переменная в батнике с одним знаком процента, он ожидает что-нибудь вида %1 или %9) - переменной % у нас нет, поэтому формируя строчку на запуск, cmd подставляет вместо знака процента пустое место. Ну и запускается у нас команда set "s=".

SapSat

Цитата:
Если же это значение ! aaa % bbb формируется где-то динамически, то оно будет гулять в вправильном виде

Там свои заморочки - зависит от того, что ты делаешь с содержимым переменной и установлена ли директива отложенного раскрытия переменных.
Автор: 01MDM
Дата сообщения: 30.11.2007 13:57
Elroir
Это все понятно, у меня возник вопрос на предыдущей странице. Все никак не доведу до ума typewriter
Автор: SapSat
Дата сообщения: 30.11.2007 14:30
01MDM
Тебе пойдет такое решение твоего TypeWriter ?


Код:
@echo off
for /f "tokens=*" %%i in (1.txt) do (
set "line=%%i" && call:go
echo.
)
goto:eof

:go
setlocal enabledelayedexpansion
set count=0

:next
set /p= !line:~%count%,1!<nul
set /a count+=1
ping -n 1 localhost >nul
if not "!line:~%count%,1!"=="" goto:next
Автор: 01MDM
Дата сообщения: 30.11.2007 14:37
SapSat
Не понял? В чем отличие
Автор: SapSat
Дата сообщения: 30.11.2007 14:48
Неважно - как, главное, чтобы клиент был доволен...
У тебя работает?

.
Автор: 01MDM
Дата сообщения: 30.11.2007 14:51
SapSat
Работает, только много пробелов
Автор: Elroir
Дата сообщения: 30.11.2007 15:22
01MDM
Я пока тоже не могу найти другого решения, кроме добавления пробела...
Автор: 01MDM
Дата сообщения: 30.11.2007 15:30
Elroir
Лучше забыть. Баловство все это..
Автор: SapSat
Дата сообщения: 30.11.2007 15:57
Ладно, тогда другой вопрос по твоему TypeWriter

Вставил в начало батника строку

chcp 1251 >nul

Однако при прогоне большого txt в кодировке 1251 -
TypeWriter долго печатает кряказябры, и только после выхода из батника рефрешит кодировку и текст становится читаемым...

Как зарефрешить консоль сразу после команды chcp 1251 >nul

?
Автор: 01MDM
Дата сообщения: 30.11.2007 18:59
SapSat
Вот мой окончательный вариант. С кодировкой вроде все в порядке.

Код:
@echo off
chcp 1251 >nul
set /p file="Chооse a file: "
cls
for /f "tokens=*" %%i in ('type %file%') do (
set "line=%%i" && call:parsing
echo.
)
chcp 866 >nul
goto:eof

:parsing
setlocal enabledelayedexpansion
set count=0

:next
if "!line:~%count%,1!"=="=" set /p= = <nul
set /p=!line:~%count%,1!<nul 2>nul
set /a count+=1
ping -n 1 localhost >nul
if not "!line:~%count%,1!"=="" goto:next
goto:eof

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

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


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