Компьютерный форум 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=321196)

CyraxZ 27-11-2016 23:28 2691003

Невозможно выполнить замену текста в текстовом файле
 
Вложений: 1
Необходимо выполнить замену текста в файле с русским текстом. Для примера, необходимо цифру 1 заменить на 2. Кодировка файла - win-1251.

Вариант 1 - bat-файл:
Код:

@echo off
:: -----------------------------------------
::Set verfile=php.ini
::Set tmpfile=php.ini.tmp
::Set fin=1
::Set rep=2
:: -----------------------------------------

@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION

set INTEXTFILE=php.ini
set OUTTEXTFILE=php.ini.tmp
set SEARCHTEXT=1
set REPLACETEXT=2

FOR /F %%L IN (php.ini) DO (
  SET "line=%%L"
  SETLOCAL ENABLEDELAYEDEXPANSION
  ECHO !line:%SEARCHTEXT%=%REPLACETEXT%!>>%OUTTEXTFILE%
  ENDLOCAL
)
ENDLOCAL

В итоге получаем файл без комментариев, без пустых строк и без некоторых директив.

Вариант 2. Утилита FART
Код:

fart.exe -p  -- php.ini 1 2
Эта утилита ничего не находит в сабжевом файле. Находит, только если убрать русский текст.

Вопрос: в Windows XP вообще возможно выполнить элементарную замену текста ?

Iska 27-11-2016 23:43 2691006

CyraxZ, пакетные файлы, мягко говоря, вообще не особо предназначены для операций поиска и замены текста — весьма ограниченный функционал. Но со времён Windows 98 в комплекте ОС идёт WSH — Windows Script Host, с несколькими входными языками (в комплекте идут VBScript и JScript).

Для простоты понимания идеи я не стал обременять код поддержкой параметров, разнообразными проверками и созданием резервной копии:
Код:

Option Explicit

Dim strSourceFile
Dim strContent


strSourceFile = "C:\Мои проекты\0027\php.ini"

With WScript.CreateObject("Scripting.FileSystemObject")
        With .OpenTextFile(strSourceFile)
                strContent = .ReadAll()
                .Close
        End With
       
        With .CreateTextFile(strSourceFile)
                .Write Replace(strContent, "1", "2")
                .Close
        End With
End With

WScript.Quit 0


CyraxZ 28-11-2016 01:21 2691030

Да. vbs работает нормально.
В общем-то, что угодно можно запрограммировать. Без всяких батников и без всяких утилит. Во как !

Iska 28-11-2016 02:20 2691036

Цитата:

Цитата CyraxZ
В итоге получаем файл без комментариев »

По умолчанию разбор по for /f рассматривает строки, начинающиеся с символа «;», как комментарии и пропускает их. Используйте ключ «eol=» без указания значения:
Код:

for /f "eol=" …
Цитата:

Цитата CyraxZ
без пустых строк »

Разбор по for /f пропускает пустые строки. Управлять этим поведением невозможно, есть только методики, позволяющие использовать обходные пути, что усложняет код.

Цитата:

Цитата CyraxZ
и без некоторых директив. »

Особенность языка пакетных файлов. Причём, данное поведение характерно не только для них, но для кучи других языков, либо не имеющих отдельного литерала «Строка», либо рассматривающего его с ограничениями (например, терминатор в C), либо — т.н. escape-символы внутри строки (те же пакетные файлы, C, отчасти PowerShell и пр.).

Цитата:

Цитата CyraxZ
В общем-то, что угодно можно запрограммировать. Без всяких батников и без всяких утилит. Во как ! »

К сожалению, не всё, есть достаточно много проблем. Поэтому, начиная с Vista, появился ещё один язык — PowerShell (доступен и для Windows XP).


Время: 15:04.

Время: 15:04.
© OSzone.net 2001-