PDA

Показать полную графическую версию : [решено] удаление части строки


nvitek
09-03-2011, 14:11
Привет Алл!
Вопрос детский, наверное. )
Есть файл, который формируется ежедневно. в нем такие строки

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

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

gora
09-03-2011, 14:34
Примерно так:@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
Спасибо, работает.

~Cache~
27-08-2014, 13:35
Примерно так »

если изменить запрос, к примеру, на 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
SET "file=test.txt"
SET "ftmp=%file%.tmp"
SET "srt=|CD"
и что это?
вообще бессмысленное действие обрамлять переменную со значениями в кавычки

Iska
27-08-2014, 14:24
вообще бессмысленное действие обрамлять переменную со значениями в кавычки »
Это не так.

~Cache~
27-08-2014, 14:25
Это не так. »
допустим, но это не на что не повлияло, как лишнее из файла не удалялось, так и не удаляется

~Cache~
27-08-2014, 14:31
Ну, так делайте по-своему, посмотрим, что из этого выйдет. »
повторюсь, ваш совет - не помог, даже если оно и не бессмысленно
хотя в большинстве языков программирования в кавычки помещают значение, а не "переменная=значение"

Iska
27-08-2014, 14:35
~Cache~, язык пакетных файлов — не «язык программирования».

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

~Cache~
27-08-2014, 14:39
Пример своего кода Вы привели. Теперь приведите образец файла, упаковав его в архив. »
прошу прощения, но переспрошу, вам нужен результат работы скрипта? т.к. сам скрипт создает данный файл командой DIR /b /s /a:d > %file%

~Cache~
27-08-2014, 14:47
~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
т.к. сам скрипт создает данный файл командой DIR /b /s /a:d > %file% »
Значит, я не совсем понял логику работы пакетного файла.

или вы считаете, что запись SET srt=|CD подразумевает присвоение переменной srt фразы "|CD" а не присвоение переменной str значения от выполнения команды CD ? »
Ни то, ни другое. Это попытка передать команде «CD», выводящей текущий каталог (именно поэтому Вы и видите:
вывод: c:\Program Files »
), пустой вывод команды «SET srt=». В результате такого перенаправления команда «SET srt=» не отрабатывает.

~Cache~
27-08-2014, 15:23
вывод: c:\Program Files »
), пустой вывод команды «SET srt=». В результате такого перенаправления команда «SET srt=» не отрабатывает. »
допустим, я не правильно использовал перенаправление
тогда, как присвоить переменной str значениие вывода команды cd?

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

Iska
27-08-2014, 15:39
тогда, как присвоить переменной str значениие вывода команды cd? »
А не надо присваивать значение вывода (и почему «str», было ж «srt»?). Достаточно:
set srt=%CD%

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

~Cache~
27-08-2014, 16:03
(и почему «str», было ж «srt»?) »
опечатка при написании поста
Там было вообще непонятно — зачем «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
вообще - суть моего скрипта, получить названия директорий и поддиректорий исходя из текущего расположения скрипта (т.е. все директории расположенные в данной папке, а так же вложенные в них), без полных путей »
Пробуйте:
@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
Так? Или от вложенных каталогов нужны только имена, а не относительные пути? »
судя по выводу консоли - то что нужно, хотя вариант с выводом только последнего каталога тоже бы пригодился...
но сразу вопрос, как в таком варианте скрипта вывести результат в файл?

как в таком варианте скрипта вывести результат в файл? »
видимо сам отвечу:
@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
но сразу вопрос, как в таком варианте скрипта вывести результат в файл? »
Я обычно делаю так:
@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


хотя вариант с выводом только последнего каталога тоже бы пригодился... »
@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
огромное спасибо




© OSzone.net 2001-2012