Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/76: Рейтинг темы: голосов - 76, средняя оценка - 4.66
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823

Вывести строку, являющуюся переменной

03.06.2016, 11:41. Показов 14394. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надо решить такую задачку, только попрошу без участия "возможно, вероятно, наверное, попробуй"
Нужно четкое и правильное проверенное объяснение.

Вот так вывожу из файла строку "%f%"
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
<"file.txt" find "%%f%%"
pause
Вот так тоже могу вывести
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
<"file.txt" find "%%f%%"|set/p x=^& cmd/v/c call echo:!x!
pause
Так вижу искомую строку
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
for /f "delims=" %%a in ('type "file.txt"') do call echo %%a
pause
Но если беру в for
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
for /f "delims=" %%a in ('^<"file.txt" find "%%f%%"') do call echo %%a
pause
уже не выводится ни с call ни без, хотя, если закомментировать set и убрать call - выводится, но это-то все как раз надо.

И еще, чтобы новую тему не создавать
так переменная есть
Windows Batch file
1
type "file.txt"|set/p x=^& cmd/v/c echo:!x!
так нет
Windows Batch file
1
type "file.txt"|set/p x=^& cmd/v/c echo:!x:a=b!
надо именно так
Windows Batch file
1
type "file.txt"|set/p x=^& cmd/v/c echo !x:a=b!
почему?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2016, 11:41
Ответы с готовыми решениями:

Подсчет количества вхождений заданного слова в строку, являющуюся значением переменной
Добрый день! Подскажите как решить такую задачу: Имеется строка в переменной вида: слово1;ffwerg;слово2;слово1ddas Нужно...

Сформировать строку, являющуюся самым коротким текстовым представлением числа
Помогите решить задачу. Пожалуйста.

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

8
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
03.06.2016, 13:48
Цитата Сообщение от alpap
Надо решить такую задачку...
В чем сложность?
Windows Batch file
1
2
3
4
5
6
@echo off
  setlocal
    set "f=stroka"
    for /f "delims=" %%i in ('3^<file.txt find "%f%" ^<^&3') do echo %%i
  endlocal
exit /b
Цитата Сообщение от alpap
почему?
Потому что невнимательны: !x:a=b! пытается заменить в переменной x все вхождения a на b.
1
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
03.06.2016, 14:13  [ТС]
greg zakharov,
Вы или пошутили...
В файле "file.txt", среди прочих есть строка "%f%", надо ее найти и вывести на экран, можно раскрыв можно нет или в файл тоже двумя вариантами. Ваш код в find раскрывает переменную и ищет уже "stroka", вместо "%f%", неужели я стал бы писать сюда такие мелочи?
Цитата Сообщение от greg zakharov Посмотреть сообщение
!x:a=b! пытается заменить в переменной x все вхождения a на b
да хоть 200раз, но почему тут echo:!x! двоеточие не мешает работе, а тут echo:!x:a=b! - мешает и приходиться писать echo !x:a=b!, а привычка дело сильное.
0
 Аватар для ComSpec
3463 / 2001 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
03.06.2016, 19:21
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

alpap, Вы, наверное, заметили, что я в своих кодах не использую echo:.

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

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

Практика же на самом деле выявляет другие случаи...

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

В своих кодах (они есть на нашем форуме, поленился искать) для такого случая я использую echo( или echo=
(
Windows Batch file
1
type "file.txt"| set/p x=^& cmd/v/c echo(!x:a=b!
;
Windows Batch file
1
type "file.txt"| set/p x=^& cmd/v/c echo=!x:a=b!
)
или экранирую знак равенства в строке модифицированного расширения переменной
(
Windows Batch file
1
type "file.txt"| set/p x=^& cmd/v/c echo.!x:a^^^^=b!
;
Windows Batch file
1
type "file.txt"| set/p x=^& cmd/v/c echo[!x:a^^^^=b!
).

Хотя обычно я пишу примерно так:
Windows Batch file
1
type "file.txt"| cmd/v/c set/p x=^& echo.!x:a^^=b!
или так:
Windows Batch file
1
type "file.txt"| cmd/v/c "set/p x=& echo.!x:a^=b!"
.






Цитата Сообщение от alpap Посмотреть сообщение
... почему?


Есть многое на свете, друг Горацио,
Что и не снилось нашим мудрецам.
6
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
03.06.2016, 23:04  [ТС]
ComSpec, Спасибо, больше понравился больше (использовал не раз, но не придавал значения) вариант:
Windows Batch file
1
...cmd/v/c set/p x=^& echo.!x:a^^=b!
а вот почему все-таки конструкция
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
for /f "delims=" %%a in ('^<"file.txt" find "%%f%%"') do call echo %%a
pause
уперто не хочет выводить %f%, ни строкой ни раскрытой, я уже и экраны пробовал ставить, чего-то не хватает..., как же тогда искать подобные строки в файле?
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
03.06.2016, 23:43
Цитата Сообщение от alpap Посмотреть сообщение
уперто не хочет выводить %f%, ни строкой ни раскрытой
Если надо найти именно строку "%f%", то переменную такую использовать в сценарии нельзя. Интерпретатор раскрывает все переменные и соответственно, строку "%f%" найти будет невозможно, т.к. он воспринимает её только как переменную.
Т.е. при наличии
set "f=stroka"
переменная %f% раскрывается и найдены могут быть только строи, содержащие символы "stroka", в этом случае Вы увидите вывод. Т.о. при вхождении в цикл, происходит двойное раскрытие переменной...
для проверки можете добавить в файл строку "stroka"...
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
04.06.2016, 00:34  [ТС]
YuS_2,
Но ведь так-то вывожу
Windows Batch file
1
2
3
4
@echo on
set "f=stroka"
<"file.txt" find "%%f%%"
pause
что в цикле мешает?
0
Любознательный
 Аватар для YuS_2
7406 / 2256 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
04.06.2016, 06:34
Цитата Сообщение от alpap Посмотреть сообщение
так-то вывожу
Так нет двойного раскрытия, тут чистое экранирование символов %, поэтому работает.

Цитата Сообщение от alpap Посмотреть сообщение
что в цикле мешает?
В cmd вообще цикл или блоки со скобками - случай особый
0
 Аватар для ComSpec
3463 / 2001 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
04.06.2016, 12:00
Лучший ответ Сообщение было отмечено alpap как решение

Решение

Цитата Сообщение от alpap Посмотреть сообщение
... как же тогда искать подобные строки в файле?


Начну издалека...

1. Команда, вывод результата выполнения которой разбирается в цикле с помощью FOR, всегда выполняется в новом процессе cmd.exe.

Это можно увидеть, используя, например, такую конструкцию:

Windows Batch file
1
2
3
4
5
@echo off
 
for /f "delims=" %%a in ('^<"file.txt" find "%%f%%"^& wmic Process where Name^='cmd.exe' get CommandLine/value') do echo.%%a
 
pause
В результате мы получим все командные строки, с помощью которых запускались процессы cmd.exe, и одной из таких строк обязательно будет разбираемая команда:
Code
1
CommandLine=C:\Windows\system32\cmd.exe /c &lt;"file.txt" find "%f%"&amp; wmic Process where Name='cmd.exe' get CommandLine/value
.

2. Результат выполнения команды в новом процессе (в новом экземпляре интерпретатора) почти всегда идентичен результату выполнения команды с использованием CALL.

Как известно, синтаксис при таком использовании CALL как раз-таки основан на возможности использования так называемого двойного расширения переменных, то есть обрамления имён переменных удвоенными символами процента.

Но практически неизвестным фактом является допустимость применения удвоенных символов процента в конструкциях с cmd.

Например, если создать файл со строкой string, то при выполнении пакетного файла с кодами

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" find "%f%"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" call find "%f%"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" call find "%%f%%"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" cmd/c find "%f%"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" cmd/c find "%%f%%"
 
pause
будет получен один и тот же результат — string.

Более того, удвоенные символы процента можно использовать и вместо восклицательных знаков в конструкциях с CMD /V.

То есть выполнение пакетного файла и с кодом

Windows Batch file
1
2
3
4
5
@echo off
 
set "f=string"& <"file.txt" call find "%%f%%"
 
pause
,
и с кодом

Windows Batch file
1
2
3
4
5
@echo off
 
set "f=string"& <"file.txt" cmd/v/c find "!f!"
 
pause
,
и с кодом

Windows Batch file
1
2
3
4
5
@echo off
 
set "f=string"& <"file.txt" cmd/v/c find "%%f%%"
 
pause
выдаст также один и тот же корректный результат — string.

3. Чтобы использовать содержащие символы процента строки в конструкциях с cmd, необходимо не только удваивать эти символы, но и ещё применять экранирование.

А в случае использования команды FIND или других команд, требующих использования кавычек, ещё необходимо экранировать и некоторые из этих кавычек.

Примеры:

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
<"file.txt" cmd/c find ^^"^%%f^%%"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
@echo off
 
set "f=string"
 
cmd/c findstr ^^%%f^^%% "file.txt"
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
8
@echo off
 
set "f=string"
 
for /f "delims=" %%a in ('^<"file.txt" find ^^"^%%f^%%"') do echo %%a
for /f "delims=" %%a in ('^<"file.txt" find ^^"^%%f^%%"') do call echo %%a
 
pause
;

Windows Batch file
1
2
3
4
5
6
7
8
@echo off
 
set "f=string"
 
for /f "delims=" %%a in ('findstr ^^%%f^^%% "file.txt"') do echo %%a
for /f "delims=" %%a in ('findstr ^^%%f^^%% "file.txt"') do call echo %%a
 
pause
.
7
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2016, 12:00
Помогаю со студенческими работами здесь

Writeln вывести строку вместе с переменной
?- R=54,writeln('Привет мир!'+R). Привет мир!+54 R = 54. ?- R=54,writeln('Привет мир!'R). ERROR: Syntax error: Operator expected...

Вывести в роли переменной каждую строку
Здравствуйте! У меня две задачи. Помогите люди умный и добрые их решить. 1. Мне необходимо как-то понять какие НОВЫЕ строки появились...

Присвоить переменной строку и вывести ее через printf
Привет всем, объясните мне кто-то, как вообще строки работают в Си. нужно программно присваивать переменной строку и вывести ее именно...

Как вывести в адресную строку категории интернет магазина данные из переменной?
Коллеги, прошу прощение если не правильно поставил вопрос. Разбираюсь в коде интернет магазина реализованного через MVC Есть...

Ввести значение переменной к-строка. Вывести эту строку без первой и последней буквы
Ввести значение переменной к-строка. Вывести эту строку без первой и последней буквы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru