Войти

Показать полную графическую версию : CMD - читаю из файла, если первый символ строки =*, то вывести на экран строку


jester7
06-02-2016, 20:54
Читаю из текстового файла строки
проверяю каждую строку, если одна из них начинается на символ *, то вывожу эту строку на экран и т.д.

вот кусок моих страданий, но он не работает:

For /F "usebackq tokens=* delims=" %%i In ("list.txt") Do (
set d=%i:~0,1%
if %d%== * @echo STROKA= %%i %d%
)


если просто ввести с клавы в переменную, то
set d=%i:~0,1%
if %d%== * @echo STROKA= %%i %d%

код срабатывает

Как бы это организовать правильно ?

Iska
06-02-2016, 21:17
Как бы это организовать правильно ? »
Вот так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in ("list.txt") do (
set sVar=%%i
if "!sVar:~0,1!" equ "*" echo %%i
)

endlocal
exit /b 0

jester7
06-02-2016, 21:40
Спасибо, работает)))
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq delims=" %%i in ("list.txt") do (
set s=%%i
if "!s:~0,1!" =="\" echo %%i
)



pause

А можно вопросы ламерские?
я уже три дня пытаюсь разобраться в этом старом программировании. (вобще-то я программирую на делфи и прочем)
подскажите, как понят этот язык ?
почему ставятся проценты, а иногда восклицательные знаки ?
= и == я понял логику
почему иногда два процента перед переменной, а иногда окружают переменную с краев?
почему иногда значение текстовой переменной без двойных кавычек, а иногда как у вас с кавычками ?
почему !s:~0,1! - в кавычках ?
почему echo - без собачки спереди ? (кажись понял, вывод на экран убран вначале кода... ЭХО ОФФ)
помогите разобраться...

Iska
06-02-2016, 22:58
почему ставятся проценты, а иногда восклицательные знаки ? »
И то, и другое означает раскрытие указанной переменной окружения. Разница в том, что «%…%» раскрывает переменную окружения сразу, в момент разбора команды, а «!…!» — в момент исполнения. В первую очередь это сказывается на операторных скобках — поскольку операторные скобки воспринимаются интерпретатором команд именно как одна единая команда. Например, в Вашем случае:
For /F "usebackq tokens=* delims=" %%i In ("list.txt") Do (
set d=%i:~0,1%
if %d%== * @echo STROKA= %%i %d%
) »
«%d%» раскрывается в момент интерпретации команды «for /f» и всё условие выглядит как:
if == * @echo STROKA= %%i
поскольку в этот момент переменная окружения «d» ещё не существует. Именно для этого вводится понятие отложенного раскрытия переменных окружения, активизируемое командой «setlocal enabledelayedexpansion», а сама переменная окружения для этого обрамляется не символами «%», а «!».

почему иногда два процента перед переменной, »
Это специальные переменные цикла «for». Они не являются переменными окружения и в отличие от них — регистрозависимы. На самом деле символ процента один — просто внутри пакетных файлов символ процента при них должен удваиваться, отсюда и два символа «%» внутри пакетных файлов. А в командной строке будет один символ.

а иногда окружают переменную с краев? »
Это обычные переменные окружения. Вы можете их увидеть по команде «set».

почему иногда значение текстовой переменной без двойных кавычек, а иногда как у вас с кавычками ? почему !s:~0,1! - в кавычках ?»
В пакетных файлах все переменные окружения — строка. Никакими символами строка не выделяется, в том числе и не обрамляется кавычками. В ряде случаев содержимое переменной окружения/переменной цикла может интерпретироваться как число.

В подобном случае:
if "!sVar:~0,1!" equ "*" echo %%i »
кавычки обычно используются на случай отсутствия переменной окружения (когда она раскрывается в пустую строку), дабы условие оставалось корректным с точки зрения синтаксиса. Кавычки могут быть заменены, например, на «[» и «]» и т.п.

почему echo - без собачки спереди ? (кажись понял, вывод на экран убран вначале кода... ЭХО ОФФ) »
Именно так.

Foreigner
06-02-2016, 23:00
А не проще найти эти строки?

findstr "^\*.*" file.txt

jester7
06-02-2016, 23:10
Спасибо за пояснение, правда я не все понял )))

блин))) даже С++ проще ))))

Iska
06-02-2016, 23:41
А не проще найти эти строки? »
Конечно, проще :).

Спасибо за пояснение, правда я не все понял ))) »
Что именно не поняли? Приведённый коллегой Foreigner код делает то же самое, что ранее рассмотренный — выводит строки файла, начинающиеся на «*».

greg zakharov
07-02-2016, 10:09
cmd:
findstr ^\* file
grep:
grep '^*.*' file
gawk:
gawk /^*/ file
sed:
sed -n /^*/p file
powershell:
Select-String ^\* file
или:
gc file | ? {$_.StartsWith('*')}

Foreigner
07-02-2016, 10:26
sed -n /^*/p file »

Если запускать в cmd.exe, то паттерн надо взять в двойные кавычки, иначе выведет все вхождения "*", включая в других частях строки. В PowerShell работает корректно.

greg zakharov
07-02-2016, 10:49
Если запускать в cmd.exe, то паттерн надо взять в двойные кавычки, иначе выведет все вхождения "*", включая в других частях строки.Какой-то странный у Вас sed, однако.

Foreigner
07-02-2016, 10:56
Какой-то странный у Вас sed, однако. »

> sed --version
GNU sed версия 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.


> type 1.txt
qqqqq
www*ww
*ttttt
6666
*mmmm
99999
> sed -n "/^*/p" 1.txt
*ttttt
*mmmm

> sed -n /^*/p 1.txt
www*ww
*ttttt
*mmmm

greg zakharov
07-02-2016, 11:30
Теперь понял о чем речь, - да, кавычки нужны, если в файле есть строки, содержащие символ * где-нибудь в середине строки. Отталкивался же от противного, так что вполне справедливое заечание с Вашей стороны.

jester7
07-02-2016, 22:29
эх, сложно для меня все это.
с процентами и восклицательными знаками так и не разобрался
пробовал сегодня приклеивание к переменной одного символа сделать, опять не вышло.
суть такова(к примеру на Паскале):
begin
s:='';
for i:=1 to 10 do
begin
s:=s+'#';
writeLn(s);
end;
end.

должен получить на экран результат:
#
##
###
#####
######
и т.д. до 10
Как это оформить на CMD ?

Iska
08-02-2016, 00:01
Как это оформить на CMD ? »
@echo off
setlocal enableextensions enabledelayedexpansion

set sVar=

for /l %%i in (1, 1, 10) do (
set sVar=!sVar!#
echo !sVar!
)

endlocal
exit /b 0

Foreigner
08-02-2016, 00:17
Еще можно так (если известна длина строки):

@echo off
setlocal enabledelayedexpansion

set "n=##########"

for /l %%i in (1,1,10) do echo !n:~0,%%i!

Алексей.Зверовщиков@vk
11-04-2022, 10:13
Добрый День подскажите пожалуйста,
:Start
if %time:~0,2% LSS 10 goto two
set re=%date%(%time:~0,2%-%time:~3,2%).htm
"C:\Program Files (x86)\Compare Suite\comparesuite.exe" "C:\Users\Alex\Desktop\equipment register\equipment register1.xls" "C:\Users\Alex\Desktop\equipment register\equipment register.xls" -r:C:\Users\Alex\Desktop\test\%re% -AllowMultipleInstance
if not errorlevel 1 goto TO
:two
"C:\Program Files (x86)\Compare Suite\comparesuite.exe" "C:\Users\Alex\Desktop\equipment register\equipment register1.xls" "C:\Users\Alex\Desktop\equipment register\equipment register.xls" -r:C:\Users\Alex\Desktop\test\%date%(%time:~1,1%-%time:~3,2%).htm -AllowMultipleInstance
:TO
for /f "usebackq delims=" %%i in ("28.03.2022(12-06).htm") do (
set sVar=%%i
if "%sVar" equ " <td class="val">73</td>" goto break
)
goto end
:break
del /q "07.04.2022(11-56).htm"
:end
timeout /t 3600
goto Start



почему то при сравнении строки не отрабатывает goto break. Спасибо

megaloman
11-04-2022, 13:52
"%sVar" - ошибка в синтаксисе, надо "%sVar%" , но это тоже работать не будет из-за отложенного раскрытия переменной в цикле.
set sVar=%%i в вашем цикле не нужно вовсе. напишите сразу:
if "%%i"==" <td class="val">73</td>" goto :break
Кстати, equ в If применяется для сравнения численных значений.
Я ничего не проверял, возможно где-то еще не то.




© OSzone.net 2001-2012