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

nvitek 09-03-2011 14:11 1630680

удаление части строки
 
Привет Алл!
Вопрос детский, наверное. )
Есть файл, который формируется ежедневно. в нем такие строки

users:
name=Vasia Pupkin
name=Yulia Ivanova
name=Sidor Pavlov

как средствами винды удалять в файле слово "name="
если не трудно пример кода

gora 09-03-2011 14:34 1630689

Примерно так:
Код:

@Echo Off
:: Обрабатываемый файл
Set file=e:\Temp\list 1.txt
:: Образец строки подлежащей удалению (без знака равно)
Set srt=name

(For /F "usebackq tokens=1* delims==" %%i In ("%file%") Do (If "%%i"=="%srt%" (Echo %%j) Else (If "%%j"=="" (Echo %%i) Else Echo %%i=%%j)))>test.txt
Copy test.txt "%file%" /Y>Nul
Del test.txt>Nul


nvitek 09-03-2011 14:50 1630698

Спасибо, работает.

~Cache~ 27-08-2014 13:35 2394814

Цитата:

Цитата gora
Примерно так »

если изменить запрос, к примеру, на set str=nam - то работать не будет, подскажите, как сделать полноценный поиск и удаление подстроки
пример кода основанного на этом, для того, чтобы было видно что пытаюсь сделать:
Код:

@ECHO OFF
CHCP 1251

:: Обрабатываемый файл
SET file=test.txt
SET ftmp=%file%.tmp
SET srt=|CD

DIR /b /s /a:d > %file%


(for /F "usebackq tokens=1* delims==" %%i in ("%file%") do (if "%%i"=="%srt%" (echo %%j) else (If "%%j"=="" (echo %%i) else echo %%i=%%j)))>%ftmp%
copy %ftmp% "%file%" /Y>nul
del %ftmp%>nul


~Cache~ 27-08-2014 14:12 2394838

Цитата:

Цитата Georgio
Код:

SET "file=test.txt"
SET "ftmp=%file%.tmp"
SET "srt=|CD"


и что это?
вообще бессмысленное действие обрамлять переменную со значениями в кавычки

Iska 27-08-2014 14:24 2394849

Цитата:

Цитата ~Cache~
вообще бессмысленное действие обрамлять переменную со значениями в кавычки »

Это не так.

~Cache~ 27-08-2014 14:25 2394850

Цитата:

Цитата Iska
Это не так. »

допустим, но это не на что не повлияло, как лишнее из файла не удалялось, так и не удаляется

~Cache~ 27-08-2014 14:31 2394853

Цитата:

Цитата Georgio
Ну, так делайте по-своему, посмотрим, что из этого выйдет. »

повторюсь, ваш совет - не помог, даже если оно и не бессмысленно
хотя в большинстве языков программирования в кавычки помещают значение, а не "переменная=значение"

Iska 27-08-2014 14:35 2394858

~Cache~, язык пакетных файлов — не «язык программирования».

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

~Cache~ 27-08-2014 14:39 2394861

Цитата:

Цитата Iska
Пример своего кода Вы привели. Теперь приведите образец файла, упаковав его в архив. »

прошу прощения, но переспрошу, вам нужен результат работы скрипта? т.к. сам скрипт создает данный файл командой DIR /b /s /a:d > %file%

~Cache~ 27-08-2014 14:47 2394865

Цитата:

Цитата Georgio
~Cache~, а где Вы видели, чтобы в выводе команды "dir" была строка "|CD"? »

вывод команды DIR из директории c:\Program Files - дает следующее:
Код:

c:\Program Files\Common Files
c:\Program Files\ConEmu
c:\Program Files\DVD Maker
c:\Program Files\Ext2Fsd

соответственно вывод CD из директории c:\Program Files = c:\Program Files


или вы считаете, что запись SET srt=|CD подразумевает присвоение переменной srt фразы "|CD" а не присвоение переменной str значения от выполнения команды CD ?
специально проверил:
Код:

SET srt=|CD
echo %srt%

вывод: c:\Program Files

Iska 27-08-2014 15:10 2394874

Цитата:

Цитата ~Cache~
т.к. сам скрипт создает данный файл командой DIR /b /s /a:d > %file% »

Значит, я не совсем понял логику работы пакетного файла.

Цитата:

Цитата ~Cache~
или вы считаете, что запись SET srt=|CD подразумевает присвоение переменной srt фразы "|CD" а не присвоение переменной str значения от выполнения команды CD ? »

Ни то, ни другое. Это попытка передать команде «CD», выводящей текущий каталог (именно поэтому Вы и видите:
Цитата:

Цитата ~Cache~
вывод: c:\Program Files »

), пустой вывод команды «SET srt=». В результате такого перенаправления команда «SET srt=» не отрабатывает.

~Cache~ 27-08-2014 15:23 2394880

Цитата:

Цитата Iska
вывод: c:\Program Files »
), пустой вывод команды «SET srt=». В результате такого перенаправления команда «SET srt=» не отрабатывает. »

допустим, я не правильно использовал перенаправление
тогда, как присвоить переменной str значениие вывода команды cd?

вы так же не обратили внимание на мой 1 пост, там было сказано об ошибке/фиче того скрипта, который тут когда-то был решен, т.е. если поменять значение переменной str c name на nam - то в файле не будет удалена часть строки соответствующая значению переменной, что видимо и мешает в моей интерпретации скрипта

Iska 27-08-2014 15:39 2394887

Цитата:

Цитата ~Cache~
тогда, как присвоить переменной str значениие вывода команды cd? »

А не надо присваивать значение вывода (и почему «str», было ж «srt»?). Достаточно:
Код:

set srt=%CD%
Цитата:

Цитата ~Cache~
вы так же не обратили внимание на мой 1 пост, там было сказано… »

Там было вообще непонятно — зачем «SET srt=|CD». Не очень понятно и теперь. Опишите словами, что именно Вам нужно получить в целом.

~Cache~ 27-08-2014 16:03 2394897

Цитата:

Цитата Iska
(и почему «str», было ж «srt»?) »

опечатка при написании поста
Цитата:

Цитата Iska
Там было вообще непонятно — зачем «SET srt=|CD». Не очень понятно и теперь. Опишите словами, что именно Вам нужно получить в целом. »

обращая внимание на первый пост я говорил не о «SET srt=|CD»
а о том, что если в том примере, который тут был изначально, (про name=Yulia Ivanova и т.д.) заменить строку (сократить ее) - то работать код перестает т.к. знак равенства находится в самом цикле
и соответственно,«SET srt=|CD» не работает и мой пример, если к примеру поменять «SET srt=|CD» на «SET srt=C:\Prog» или на «SET srt=Files» - надеюсь так понятней о чем я

я чутка разобрался, как работает данный цикл, он не ищет переменную %srt% - как я считал изначально, он разбивает строку по знаку равно и сравнивает левую часть со значением переменной %srt%
в результате, я использовал не подходящий мне скрипт (был бы коммент о принципе работы данного скрипта, не было бы столько не нужных вопросов и уточнений - была бы отдельная тема по конкретной проблеме)

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

Iska 27-08-2014 16:49 2394924

Цитата:

Цитата ~Cache~
вообще - суть моего скрипта, получить названия директорий и поддиректорий исходя из текущего расположения скрипта (т.е. все директории расположенные в данной папке, а так же вложенные в них), без полных путей »

Пробуйте:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~dp0

if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `dir /b /s /a:d "%sSourceFolder%\*.*" 2^>nul`
        ) do (
                set sFolder=%%~i
                echo !sFolder:%sSourceFolder%=!
        )
) else (
        echo Can't findsource folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0

Так? Или от вложенных каталогов нужны только имена, а не относительные пути?

~Cache~ 27-08-2014 17:02 2394935

Цитата:

Цитата Iska
Так? Или от вложенных каталогов нужны только имена, а не относительные пути? »

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

Цитата:

Цитата ~Cache~
как в таком варианте скрипта вывести результат в файл? »

видимо сам отвечу:
Код:

@echo off

setlocal enableextensions enabledelayedexpansion

set fname=test.txt
del %fname% > nul
set sSourceFolder=%~dp0


if exist "%sSourceFolder%\." (
        for /f "usebackq delims=" %%i in (
                `dir /b /s /a:d "%sSourceFolder%\*.*" 2^>nul`
        ) do (
                set sFolder=%%~i
                echo !sFolder:%sSourceFolder%=! >> %fname%
        )
) else (
        echo Can't findsource folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0


Iska 27-08-2014 17:27 2394945

Цитата:

Цитата ~Cache~
но сразу вопрос, как в таком варианте скрипта вывести результат в файл? »

Я обычно делаю так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~dp0
set sDestFile=Result.txt

if exist "%sSourceFolder%\." (
        >"%sDestFile%" (
                for /f "usebackq delims=" %%i in (
                        `dir /b /s /a:d "%sSourceFolder%\*.*" 2^>nul`
                ) do (
                        set sFolder=%%~i
                        echo !sFolder:%sSourceFolder%=!
                )
        )
) else (
        echo Can't findsource folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0

Цитата:

Цитата ~Cache~
хотя вариант с выводом только последнего каталога тоже бы пригодился... »

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~dp0
set sDestFile=Result.txt

if exist "%sSourceFolder%\." (
        >"%sDestFile%" (
                for /f "usebackq delims=" %%i in (
                        `dir /b /s /a:d "%sSourceFolder%\*.*" 2^>nul`
                ) do echo %%~nxi
        )
) else (
        echo Can't findsource folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0


~Cache~ 27-08-2014 17:32 2394953

огромное спасибо


Время: 10:30.

Время: 10:30.
© OSzone.net 2001-