Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   CMD - читаю из файла, если первый символ строки =*, то вывести на экран строку (http://forum.oszone.net/showthread.php?t=311254)

jester7 06-02-2016 20:54 2603170

CMD - читаю из файла, если первый символ строки =*, то вывести на экран строку
 
Читаю из текстового файла строки
проверяю каждую строку, если одна из них начинается на символ *, то вывожу эту строку на экран и т.д.

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

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 2603175

Цитата:

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

Вот так:
Код:

@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 2603177

Спасибо, работает)))
Код:

@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 2603191

Цитата:

Цитата jester7
почему ставятся проценты, а иногда восклицательные знаки ? »

И то, и другое означает раскрытие указанной переменной окружения. Разница в том, что «%…%» раскрывает переменную окружения сразу, в момент разбора команды, а «!…!» — в момент исполнения. В первую очередь это сказывается на операторных скобках — поскольку операторные скобки воспринимаются интерпретатором команд именно как одна единая команда. Например, в Вашем случае:
Цитата:

Цитата jester7
Код:

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», а сама переменная окружения для этого обрамляется не символами «%», а «!».

Цитата:

Цитата jester7
почему иногда два процента перед переменной, »

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

Цитата:

Цитата jester7
а иногда окружают переменную с краев? »

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

Цитата:

Цитата jester7
почему иногда значение текстовой переменной без двойных кавычек, а иногда как у вас с кавычками ? почему !s:~0,1! - в кавычках ?»

В пакетных файлах все переменные окружения — строка. Никакими символами строка не выделяется, в том числе и не обрамляется кавычками. В ряде случаев содержимое переменной окружения/переменной цикла может интерпретироваться как число.

В подобном случае:
Цитата:

Цитата Iska
Код:

if "!sVar:~0,1!" equ "*" echo %%i
»

кавычки обычно используются на случай отсутствия переменной окружения (когда она раскрывается в пустую строку), дабы условие оставалось корректным с точки зрения синтаксиса. Кавычки могут быть заменены, например, на «[» и «]» и т.п.

Цитата:

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

Именно так.

Foreigner 06-02-2016 23:00 2603193

А не проще найти эти строки?
Код:

findstr "^\*.*" file.txt

jester7 06-02-2016 23:10 2603197

Спасибо за пояснение, правда я не все понял )))

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

Iska 06-02-2016 23:41 2603204

Цитата:

Цитата Foreigner
А не проще найти эти строки? »

Конечно, проще :).


Цитата:

Цитата jester7
Спасибо за пояснение, правда я не все понял ))) »

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

greg zakharov 07-02-2016 10:09 2603260

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 2603265

Цитата:

Цитата greg zakharov
sed -n /^*/p file »

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

greg zakharov 07-02-2016 10:49 2603270

Цитата:

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

Какой-то странный у Вас sed, однако.

Foreigner 07-02-2016 10:56 2603273

Цитата:

Цитата greg zakharov
Какой-то странный у Вас 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 2603286

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

jester7 07-02-2016 22:29 2603509

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

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

Iska 08-02-2016 00:01 2603523

Цитата:

Цитата jester7
Как это оформить на 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 2603531

Еще можно так (если известна длина строки):
Код:

@echo off
setlocal enabledelayedexpansion

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

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


Алексей.Зверовщиков@vk 11-04-2022 10:13 2983066

Добрый День подскажите пожалуйста,
: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 2983080

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


Время: 22:03.

Время: 22:03.
© OSzone.net 2001-