Показать полную графическую версию : Поиск тега с помощью bat
maxd2007
07-10-2013, 17:00
Всем Привет.
Подскажите решение проблемы: мне нужно что бы bat-ник в xml фаиле (текст идет сплошняком) находил тег <ID>*****</ID> и выводил его на экран и как опция брал его еще и буфер (если возможно), фаил лежит всегда по одному пути (меняется только буква диска, поэтому нужна переменная с запросом диска), максимум что я смог сделать это:
echo off
cls
set /p x=Enter Letter:
for /f "usebackq tokens=*" %%a in ("%x%:\1\file.txt") do (echo %%~a)
pause
но оно работает только в txt =( и выводит все.
PS
Извиняюсь за безграмотность (если глупость написал), ожидаю всезнающего гуру в поисках просветления =)
мне нужно что бы bat-ник в xml фаиле (текст идет сплошняком) находил тег <ID>*****</ID> »
По большому счёту — никак: сегодня сплошняком, завтра — нет; кодировки. В лучшем случае можно попробовать портированные утилиты из Unix. Я же лично для работы с xml взял бы WSH или PoSH. Впрочем, и там, и там останется вопрос с буфером обмена; у Вас какая ОС?
maxd2007
07-10-2013, 18:50
Попробовал так:
echo off
cls
Find /I "<ID>*</ID>" "C:\1\file.txt"
pause
Ищет только жестко название т.е. <ID>*</ID> а не <ID>321</ID>, а xml вообще проигнорировал и выдал все что было в нем =(
Windows XP x32 и Windows 7 x32
Кодировка уже 6 лет не менялась, по крайней мере в этих фаилах
Foreigner
07-10-2013, 20:21
maxd2007, Батник без сторонних утилит плох для работы с текстом, я бы использовал PowerShell, но без примера файла ( валидного xml ), это пустой разговор. Попробуйте такой вариант, с учетом, что файл однострочный и в нем один элемент "ID":
@echo off
setlocal
set /p content=<"1.txt"
set "content=%content:<ID>=!%"
set "content=%content:</ID>=!%"
set "content=%content:<=^<%"
set "content=%content:>=^>%"
for /f "tokens=2 delims=!" %%i in ( "%content%" ) do (
echo %%i
echo.%%i| clip
)
Если разделитель "!" не подойдет ( например есть комментарий ), найдите уникальный для данного файла.
maxd2007
08-10-2013, 14:22
батник закрывается я не успеваю прочитать (что там, ошибка или ....), команда pause не помогает. В атаче пример xml фаила. И если честно то я не совсем понял на счет делителя (((
Foreigner
08-10-2013, 19:29
maxd2007, У меня все отработало правильно, в консоль вывел 3684640102, тоже самое сохранилось в буфере обмена.
Расскажите, как запускаете. И надеюсь, что правильно прописали путь к GarminDevice.xml ( вместо 1.txt ), например:
set /p content=<"D:\Downloads\GarminDevice.xml"
На PowerShell:
$id = ( [xml] ( gc "D:\Downloads\GarminDevice.xml" )).device.id
$id; $id | clip
maxd2007
09-10-2013, 13:32
В атаче принт скрин того что и как я делаю, (черный экран это проскакивает скрипт), попробую еще на PowerShell сегодня и отпишусь
Foreigner
09-10-2013, 18:58
В атаче принт скрин того что и как я делаю »
А зачем вы убрали восклицательный знак?? Я понимаю, если бы заменили на другой разделитель. Он там не просто так, "!" в xml является спецсимволом, и если в файле нет комментария "<!--", то с большой долей вероятности он будет отсутствовать в теле документа, что позволяет разбить строку ( delims=! ) и взять нужную часть из нее ( tokens=2 ). Просто скопируйте батник и измените путь к файлу.
maxd2007
09-10-2013, 19:22
Блин извини это я из за того что не понял на счет делителя игрался и убрал их и забыл, а т.к. вечер был то забыл восстановить, а первый раз он закрывался сразу и я не видел что там, но сегодня (после Вашего последнего поста), вернул все как было и добавил "pause":
@echo off
setlocal
set /p content=<"C:\1\GarminDevice.xml"
set "content=%content:<ID>=!%"
set "content=%content:</ID>=!%"
set "content=%content:<=^<%"
set "content=%content:>=^>%"
for /f "tokens=2 delims=!" %%i in ( "%content%" ) do (
echo %%i
pause
echo.%%i| clip
)
Теперь я вижу номер =) (урааааа спасибо), но в буфер кстати не берет =( (т.е. когда нажимаю ctrl+v то появляется мой старый буфер, а не ID из xml )
Foreigner
09-10-2013, 19:34
но в буфер кстати не берет »
Странно. На win-8 берет. Какая у вас версия виндоус, может там нет C:\Windows\System32\clip.exe? Попробуйте pause вставить в самом конце батника.
Какая у вас версия виндоус, »
Судя по скриншоту — Windows XP. Там как раз нет «clip.exe» в комплекте. maxd2007, возьмите «clip.exe» из комплекта Resource Kit'а.
Foreigner
09-10-2013, 21:48
возьмите «clip.exe» из комплекта Resource Kit'а. »
Как вариант комбайн, который не будет лишним, а в XP, имхо, просто необходим. С помощью Nircmd (http://www.nirsoft.net/utils/nircmd.html):
...
for /f "tokens=2 delims=!" %%i in ( "%content%" ) do (
echo %%i
nircmdc clipboard set %%i
)
maxd2007
10-10-2013, 16:08
У меня основная винда ХР х32 и да, по пути C:\Windows\System32\clip.exe этого фаила нет, может есть сторонние утилиты или может можно как то с 8 ки портировать
может есть сторонние утилиты »
С помощью Nircmd (http://www.nirsoft.net/utils/nircmd.html): »
maxd2007
10-10-2013, 18:44
Спасибо всем большое, все работает как надо. Resource Kit не помог, но я нашел отдельно clip.exe и кинул его в windows\system32 и все теперь работает и берет в буфер.
sunnykey
11-10-2013, 18:03
#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
$CurPath=(Read-Host -Prompt "Введите имя диска")+"\1\file.txt"
[windows.forms.Clipboard]::Clear()
[xml]$xml=gc $CurPath
$CurId=$xml.Device.Id.ToString()
if (($str -ne $null) -and ($str -ne '')) {
[Windows.Forms.Clipboard]::SetText($CurId)
}
"ID=$CurId"
Помогите распарсить файл с выводом в переменные значения между тегами DISPLAYDESCRIPTION
Заморочка в наличии пробелов в искомых значениях.
Foreigner
10-07-2016, 21:18
sov44, Вариант через задницу:
@echo off
setlocal
for /f "tokens=*" %%i in ('type 11-1.txt') do set "content=%%i"
set "content=%content:<DISPLAYDESCRIPTION>=DD___%"
set "content=%content: =___%"
set "content=%content:<=,%"
set "content=%content:>=,%"
for %%i in (%content%) do (
for /f "tokens=*" %%j in ('"echo %%i | findstr "DD___""') do call:0 %%j
)
goto:eof
:0
set "result=%~1"
set "result=%result:DD___=%"
set "result=%result:___= %"
echo %result%
PowerShell
([xml](gc 11-1.txt)).WIM.IMAGE.DISPLAYDESCRIPTION
sov44,
@echo off
setlocal enabledelayedexpansion
<"11.txt">>"111.txt" (
for /f "delims=" %%a in ('more') do @(
set "s=%%a"& set "s=!s: =_!"& set "s=!s:><=> <!"
for %%b in (!s!) do @(
for /f "tokens=3 delims=<>" %%c in ('echo "%%b"^|find "DISPLAYDESCRIPTION"') do @(
set "ns=%%c"& echo !ns:_= !
)
)
)
)
exit
.
alpap, точно, "s=!s: =_!"
Скрипт считает, но долго. Есть-ли иной способ, более шустрый на bat или на гибридном бат?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.