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

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

H1ghlander 14-04-2012 22:26 1899807

Спецсимволы при перенаправлении
 
В общем возникла проблема при написании батника:
считываю построчно текстовый файл и перенаправляю строки в другой тестовый файл, но проблема в том что в файле некоторые строки содержат спецсимволы (<>&) и при перенаправлении, через обычное 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 1899852

Специмволы вообще экранируются через ^, но если неизвестно заранее, сколько их будет в строке - это не выход. Но если использовать вывод внутри цикла, то его особенностью будет то, что нахождение в считанной строке специмволов не повлияет на вывод. Пример:
Код:

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

вроде работает. только есть одна проблема, если встречается пустая строка, то в новый файл записывается "Режим вывода команд на экран (ECHO) отключен."
как это можно исправить??

Anonymоus 15-04-2012 00:15 1899883

H1ghlander, у меня на XP SP3 цикл for просто игнорирует пустые строки, не могу воспроизвести, увы. Но попробуйте заменить Echo %%A>>"%OutFile%" на
Код:

If Not "%%A"=="" (Echo %%A>>"%OutFile%") Else (Echo.>>"%OutFile%")

H1ghlander 15-04-2012 09:39 1899973

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

El Sanchez 15-04-2012 11:32 1900005

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 1900030

El Sanchez,
Твой вариант выводит только номера строк, да и причем всех подряд, в том числе где есть пусты строки

Anonymоus 15-04-2012 13:37 1900070

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 1900188

Цитата:

Цитата H1ghlander
Твой вариант выводит только номера строк, да и причем всех подряд, в том числе где есть пусты строки »

H1ghlander, неправда, но кавычки я пропустил :). Исправил.

CyberMuesli 21-05-2012 02:40 1919561

Код:

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

CyberMuesli, автор указывает, что чтение происходит из текстового файла, и сколько там спецсимволов, и есть ли они - заранее не известно. О экранировании через '^' уже написано во втором сообщении, но это не выход - не редактировать же каждый раз исходный файл перед обработкой?

Цитата:

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

Хотя с решением я немного опоздал, но стоит заменить "Echo %%A" на "Echo.%%A", чтобы пустые строки нормально выводились.

CyberMuesli 21-05-2012 16:00 1919918

Цитата:

Цитата Anonymоus
автор указывает, что чтение происходит из текстового файла »


Я не проверял с чтением из файла. Зато я проверил на простом echo. При наличии символов <&> echo %A% работает неправильно, а echo !A! работает правильно. Быть может, предварительное чтение файлов что-то меняет... Вечером проверю

Iska 21-05-2012 16:14 1919932

А при наличии символов «!»?

CyberMuesli 22-05-2012 02:36 1920153

Цитата:

Цитата Iska
А при наличии символов «!»? »

вот взяли бы, да и проверили)


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

Да. Чтение файла всё меняет. Оно читает не по-честному, у меня пропадают восклицательные знаки

Код:

@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 - это жесть.

Iska 22-05-2012 03:31 1920166

Цитата:

Цитата CyberMuesli
вот взяли бы, да и проверили) »

Прошу прощения. Я думал, Вы поймёте, что вопрос был из разряда риторических.


Время: 06:48.

Время: 06:48.
© OSzone.net 2001-