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

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

maxd2007 07-10-2013 17:00 2230289

Поиск тега с помощью bat
 
Всем Привет.
Подскажите решение проблемы: мне нужно что бы 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
Извиняюсь за безграмотность (если глупость написал), ожидаю всезнающего гуру в поисках просветления =)

Iska 07-10-2013 18:08 2230340

Цитата:

Цитата maxd2007
мне нужно что бы bat-ник в xml фаиле (текст идет сплошняком) находил тег <ID>*****</ID> »

По большому счёту — никак: сегодня сплошняком, завтра — нет; кодировки. В лучшем случае можно попробовать портированные утилиты из Unix. Я же лично для работы с xml взял бы WSH или PoSH. Впрочем, и там, и там останется вопрос с буфером обмена; у Вас какая ОС?

maxd2007 07-10-2013 18:50 2230372

Попробовал так:
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 2230448

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 2230762

батник закрывается я не успеваю прочитать (что там, ошибка или ....), команда pause не помогает. В атаче пример xml фаила. И если честно то я не совсем понял на счет делителя (((

Foreigner 08-10-2013 19:29 2230930

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 2231295

В атаче принт скрин того что и как я делаю, (черный экран это проскакивает скрипт), попробую еще на PowerShell сегодня и отпишусь

Foreigner 09-10-2013 18:58 2231537

Цитата:

Цитата maxd2007
В атаче принт скрин того что и как я делаю »

А зачем вы убрали восклицательный знак?? Я понимаю, если бы заменили на другой разделитель. Он там не просто так, "!" в xml является спецсимволом, и если в файле нет комментария "<!--", то с большой долей вероятности он будет отсутствовать в теле документа, что позволяет разбить строку ( delims=! ) и взять нужную часть из нее ( tokens=2 ). Просто скопируйте батник и измените путь к файлу.

maxd2007 09-10-2013 19:22 2231550

Блин извини это я из за того что не понял на счет делителя игрался и убрал их и забыл, а т.к. вечер был то забыл восстановить, а первый раз он закрывался сразу и я не видел что там, но сегодня (после Вашего последнего поста), вернул все как было и добавил "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 2231557

Цитата:

Цитата maxd2007
но в буфер кстати не берет »

Странно. На win-8 берет. Какая у вас версия виндоус, может там нет C:\Windows\System32\clip.exe? Попробуйте pause вставить в самом конце батника.

Iska 09-10-2013 21:35 2231632

Цитата:

Цитата Foreigner
Какая у вас версия виндоус, »

Судя по скриншоту — Windows XP. Там как раз нет «clip.exe» в комплекте. maxd2007, возьмите «clip.exe» из комплекта Resource Kit'а.

Foreigner 09-10-2013 21:48 2231638

Цитата:

Цитата Iska
возьмите «clip.exe» из комплекта Resource Kit'а. »

Как вариант комбайн, который не будет лишним, а в XP, имхо, просто необходим. С помощью Nircmd:
Код:

...

for /f "tokens=2 delims=!" %%i in ( "%content%" ) do (

    echo %%i
    nircmdc clipboard set %%i

)


maxd2007 10-10-2013 16:08 2232055

У меня основная винда ХР х32 и да, по пути C:\Windows\System32\clip.exe этого фаила нет, может есть сторонние утилиты или может можно как то с 8 ки портировать

Iska 10-10-2013 16:13 2232058

Цитата:

Цитата maxd2007
может есть сторонние утилиты »

Цитата:

Цитата Foreigner
С помощью Nircmd: »


maxd2007 10-10-2013 18:44 2232198

Спасибо всем большое, все работает как надо. Resource Kit не помог, но я нашел отдельно clip.exe и кинул его в windows\system32 и все теперь работает и берет в буфер.

sunnykey 11-10-2013 18:03 2232787

Код:

#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"


sov44 10-07-2016 17:09 2649493

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

Foreigner 10-07-2016 21:18 2649550

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

alpap 10-07-2016 22:21 2649566

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

.

sov44 10-07-2016 22:52 2649578

alpap, точно, "s=!s: =_!"

Скрипт считает, но долго. Есть-ли иной способ, более шустрый на bat или на гибридном бат?

Foreigner 10-07-2016 23:06 2649583

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 call:0 "%%i"

goto:eof

:0

set a=%1

1>nul 2>&1 set %a:!!==%

if defined dd echo %dd:___= %
set "dd="


alpap 11-07-2016 01:31 2649607

sov44,
Вот так вот и быстро и более правильно:
Код:

@echo off
setlocal enabledelayedexpansion
<"11.txt">$ (for /f "delims=" %%a in ('more') do @set "x=%%a"& set "x=!x:><=>","<!"& for %%a in ("!x!") do @set "x=%%~a"& echo !x!)
<$>>"file.txt" (for /f "tokens=2 delims=><" %%a in ('find "<DISPLAYDESCRIPTION>"') do @echo %%a)& del $
exit

.


Время: 20:13.

Время: 20:13.
© OSzone.net 2001-