Показать полную графическую версию : Спецсимволы при перенаправлении
H1ghlander
14-04-2012, 22:26
В общем возникла проблема при написании батника:
считываю построчно текстовый файл и перенаправляю строки в другой тестовый файл, но проблема в том что в файле некоторые строки содержат спецсимволы (<>&) и при перенаправлении, через обычное echo возникают ошибки. Можно ли как-то за экранировать эти символы, что бы в новый файл все записалось как надо??
Вот часть скрипта:
@echo off
for /f "tokens=* delims=" %%a in (c:\12.txt) do call :Change "%%a"
:Change
set Text=%~1
echo %~1|findstr "43" > nul
if %errorlevel% == 0 (
(echo VarC=200)>> c:\newfile.txt
) else (
echo %Text% >> c:\newfile.txt
)
Anonymоus
14-04-2012, 23:21
Специмволы вообще экранируются через ^, но если неизвестно заранее, сколько их будет в строке - это не выход. Но если использовать вывод внутри цикла, то его особенностью будет то, что нахождение в считанной строке специмволов не повлияет на вывод. Пример:
@Echo Off
Set InFile=test.txt
Set OutFile=out.txt
For /F "usebackq delims=" %%A In ("%InFile%") Do (
Echo %%A|Find "43">nul&&(
Echo VarC=200>>"%OutFile%"
)||(
Echo.%%A>>"%OutFile%"
)
)2>nul
Недостаток - если искомый паттерн ("43") будет в одной строке со спецсимволами, его Find не найдет.
H1ghlander
15-04-2012, 00:00
вроде работает. только есть одна проблема, если встречается пустая строка, то в новый файл записывается "Режим вывода команд на экран (ECHO) отключен."
как это можно исправить??
Anonymоus
15-04-2012, 00:15
H1ghlander, у меня на XP SP3 цикл for просто игнорирует пустые строки, не могу воспроизвести, увы. Но попробуйте заменить Echo %%A>>"%OutFile%" на
If Not "%%A"=="" (Echo %%A>>"%OutFile%") Else (Echo.>>"%OutFile%")
H1ghlander
15-04-2012, 09:39
Нет не помогает.
Сообщение появляется, только в том случае если перед переносом строки находится пробелы или знаки табуляции.
El Sanchez
15-04-2012, 11:32
H1ghlander, попробуйте так:
For /F "Tokens=1* Delims=:" %%A In ('Type "C:\12.txt"^|FindStr /in $') Do ((@Echo:"%%B"|Find "43" 1>nul&&@Echo:VarC=200)&(@Echo:"%%B"|Find /v "43" 1>nul&&@Echo:%%B))>>out.txt
H1ghlander
15-04-2012, 12:30
El Sanchez,
Твой вариант выводит только номера строк, да и причем всех подряд, в том числе где есть пусты строки
Anonymоus
15-04-2012, 13:37
H1ghlander, вот ещё такой вариант, в этом случае делает проверку, не является ли таб или пробел первым символом строки, если да - то пишет пустую строку. А вообще, это очень плохое решение, вам стоит помотреть в сторону sed (http://gnuwin32.sourceforge.net/packages/sed.htm)
@Echo Off
SetLocal EnableDelayedExpansion
Set InFile=test.txt
Set OutFile=out.txt
For /F "usebackq delims=" %%A In ("%InFile%") Do (
Set String=%%A
Echo %%A|Find "43">nul&&(
Echo VarC=200>>"%OutFile%"
)||(
If Not "!String:~,1!"==" " If Not "!String:~,1!"==" " Echo %%A>>"%OutFile%"
If "!String:~,1!"==" " Echo.>>"%OutFile%"
If "!String:~,1!"==" " Echo.>>"%OutFile%"
)
) 2>nul
pause
El Sanchez
15-04-2012, 17:51
Твой вариант выводит только номера строк, да и причем всех подряд, в том числе где есть пусты строки »
H1ghlander, неправда, но кавычки я пропустил :). Исправил.
CyberMuesli
21-05-2012, 02:40
@echo off
setlocal enabledelayedexpansion
set A1=^<A^&B^>
set A1
echo A1=!A1!
echo !A1!>temp.tmp
type temp.tmp
del temp.tmp
C:>test.bat
A1=<A&B>
A1=<A&B>
<A&B>
Anonymоus
21-05-2012, 03:10
CyberMuesli, автор указывает, что чтение происходит из текстового файла, и сколько там спецсимволов, и есть ли они - заранее не известно. О экранировании через '^' уже написано во втором сообщении (http://forum.oszone.net/post-1899852-2.html), но это не выход - не редактировать же каждый раз исходный файл перед обработкой?
Нет не помогает.
Сообщение появляется, только в том случае если перед переносом строки находится пробелы или знаки табуляции. »
Хотя с решением я немного опоздал, но стоит заменить "Echo %%A" на "Echo.%%A", чтобы пустые строки нормально выводились.
CyberMuesli
21-05-2012, 16:00
автор указывает, что чтение происходит из текстового файла »
Я не проверял с чтением из файла. Зато я проверил на простом echo. При наличии символов <&> echo %A% работает неправильно, а echo !A! работает правильно. Быть может, предварительное чтение файлов что-то меняет... Вечером проверю
А при наличии символов «!»?
CyberMuesli
22-05-2012, 02:36
А при наличии символов «!»? »
вот взяли бы, да и проверили)
@echo off
setlocal enabledelayedexpansion
set A1=^<A^&B^^^!^>
set A1
echo A1=!A1!
echo !A1!>temp.tmp
type temp.tmp
del temp.tmp
C:>x.bat
A1=<A&B!>
A1=<A&B!>
<A&B!>
Ошибка в синтаксисе команды.
echo %A1%
CyberMuesli
22-05-2012, 02:58
Да. Чтение файла всё меняет. Оно читает не по-честному, у меня пропадают восклицательные знаки
@echo off
setlocal enabledelayedexpansion
set A1=^<A^&B^^^!^>
echo !A1!>source.tmp
echo !A1!>>source.tmp
echo !A1!>>source.tmp
del destination.tmp
for /f "tokens=* delims=" %%i in (source.tmp) do (
set A1=%%i
set A1
echo !A1!>> destination.tmp
)
а без enabledelayedexpansion трудности с символами перенаправления. Что тут, сказать... BAT - это жесть.
вот взяли бы, да и проверили) »
Прошу прощения. Я думал, Вы поймёте, что вопрос был из разряда риторических.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.