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

MultiMax 17-05-2011 11:48 1677737

Копирование первой строки из файла
 
Вложений: 1
  • broad.7z (575 bytes, скачиваний: 36)
Помогите пожалуйста! Есть файл broad.int из него нужно скопировать в файл 1. txt первую строку. Но начать копирование только после 14ого символа в первой строке... То есть в конечном файле должно быть только "Градусы - Кто ты"

Код:

17051110425000Градусы - Кто ты
Значения первых 14ти символов постоянно меняются.. их нужно игнорировать.. реально ли реализовать это с помощью бат скрипта? Заранее спасибо!

El Sanchez 17-05-2011 12:48 1677775

MultiMax,
Код:

@Echo Off
For /F "Tokens=*" %%A In (broad.int) Do Call :_Func "%%A"
Exit /B 0

:_Func
  Set "Str=%~1"
  If "%Str:~14%"=="" Exit /B
  Set "Str=%Str:~14%"
  Set "Str=%Str:  =$%"
  For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt


Foreigner 17-05-2011 17:28 1677975

MultiMax,
Код:

@echo off
1>nul chcp 1251
setlocal

0<broad.int set /p "string="
1>1.txt echo %string:~14%


MultiMax 17-05-2011 19:11 1678063

Спасибо! Вот только строчка длинная.. ограничить бы как-нибудь ее.. если вправо пролистать, то там пусть к файлу еще... Этот файлик нужен для вывода на радиостанции названия песни :) Вот что пишет по поводу файла разработчик:

"Во время проигрывания плей-листа в папке, где находится плей-лист, создается файл broad.int. В этом файле находится информация о проигрываемом объекте и 9-ти следующих за ним объектах.

Формат одной строчки файла:

время выхода[12]битовая маска атрибутов[2]текстовая информация[255]полный путь к файлу[255]длительность звучания[8]резервное поле2[247]0x0a

0x0a - символ конца строки
'x' - символ конца файла"

1) Можно ли как-нибудь ограничить количество символов, чтобы копировалось только название песни? В скрипте El Sanchez, удаляются кстати все символы лишние... но на второй и остальных строчках, в первой - нет :)
2) Возможно это сложно, но был бы оочень и премного благодарен и признателен, если кто-нибудь помог с тем, чтобы скрипт копировал название песни, только если она находится в каталоге E:\Music, если нет, то не обрабатывать, выдавать пустой ткст файл например.

El Sanchez 17-05-2011 20:39 1678110

Цитата:

Цитата MultiMax
удаляются кстати все символы лишние »

MultiMax, ведь вы в шапке это и сказали
Цитата:

Цитата MultiMax
должно быть только "Градусы - Кто ты" »

Цитата:

Цитата MultiMax
но на второй и остальных строчках, в первой - нет »

MultiMax, неправда. Вот, что у меня на выходе:
Код:

Hurts - Wonderful Life
Градусы - Кто ты
Gwen, Stefani - The Sweet Escape
Simply Red - Fake
Sean, Jay - Tonight
Future Of Vision - Here Comes The Rain Again
Adriana & Vivien O’Hara - Too Late To Cry
Rickitt, Adam - Everything My Heart Desires
DJ Smash - Moscow Never Sleeps
3OH!3 feat. Kesha - My First Kiss

Цитата:

Цитата MultiMax
чтобы скрипт копировал название песни, только если она находится в каталоге E:\Music, »

MultiMax, вторую строку заменить на:
Код:

For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"

MultiMax 17-05-2011 22:50 1678178

El Sanchez, да, действительно. Спасибо! Скрипт запускается раз в минуту и... в файле 1.txt накапливается информация... можно сделать так чтобы при "обновлении" все подчищалось, как в скрипте Foreigner? И если можно чтобы выводился не целый список, а только первая песенка, остальное пока что не нужно. Но спасибо вам огромное!!!

El Sanchez 18-05-2011 10:31 1678355

MultiMax,
Код:

@Echo Off
Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
  Set "Str=%~1"
  If "%Str:~14%"=="" Exit /B
  If %Cnt% EQU 1 Exit /B
  Set "Str=%Str:~14%"
  Set "Str=%Str:  =$%"
  For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A
  Set /A Cnt+=1


MultiMax 18-05-2011 17:41 1678638

El Sanchez, спасибо! Дописал куда будет сохранять только


@Echo Off
Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
If %Cnt% EQU 1 Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt
Set /A Cnt+=1


Файлик 1.txt не подчищается с каждым запуском скрипта... Накапливается по строчке все больше и больше

MultiMax 18-05-2011 17:57 1678650

Сделал вот так...

@Echo Off

del F:\Broad\1.txt
end


Set Cnt=0
For /F "Tokens=*" %%A In ('type broad.int^|FindStr /I "E:\Music"') Do Call :_Func "%%A"
Exit /B 0

:_Func
Set "Str=%~1"
If "%Str:~14%"=="" Exit /B
If %Cnt% EQU 1 Exit /B
Set "Str=%Str:~14%"
Set "Str=%Str: =$%"
For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>1.txt
Set /A Cnt+=1


Но если песня из каталога НЕ music, скрипт показывает файл следующий по списку который из папки... а в эфире-то он не играет пока что :) Можно ли сделать так, чтобы в случае, если песня не из каталога music, выдавался пустой файл? И самая последняя просьба: помогите пожалуйста сделать так, чтобы весь скрипт выполнялся по кругу каждые 20 секунд, не закрывая своего окошка (Windows Scheduler каждый раз запуская скрипт открывает окно, и оно постоянно всплывает)

MultiMax 18-05-2011 19:17 1678683

Проблема с запуском каждые 20 сек отпала! Помогите пожалуйста сделать, чтобы в случае, если песня не из каталога music, выдавался пустой файл

Foreigner 18-05-2011 19:20 1678686

MultiMax,
Попробуйте такой вариант
Код:

@echo off
setlocal
1>nul chcp 1251

0<broad.int set /p "string="

echo %string% | 1>nul 2>&1 findstr "E:\\Music" || cd.>1.txt && goto:eof

call:set %string:~14,255%

1>1.txt echo %song%
goto:eof

:set
set "song=%*"


El Sanchez 18-05-2011 21:40 1678758

Foreigner, супер! Изящное решение, ничего не скажешь.
MultiMax, добил свой вариант. Если ping не нужен удалить/закомментировать выделенное:
Код:

@Echo Off
0<broad.int Set /P "Str="
Set "Str=%Str:~14%"
Set "Str=%Str:  =$%"
For /F "Tokens=1* Delims=$" %%A In ("%Str%") Do Echo %%B|Find /i "E:\Music" 1>nul 2>&1&&Echo.%%A>1.txt||cd.>1.txt
ping 127.0.0.1 -n 20 1>nul 2>&1&&call %0


MultiMax 19-05-2011 00:11 1678833

Foreigner, El Sanchez СПАСИБО ВАМ ОГРОМНОЕ!!! Даже не знаю, как благодарить :) Все работает, версия с пингом вообще шикарна, все гениальное - просто, ведь недаром говорят) Извините за то что возможно отнял время! Еще раз СПА-СИ-БО!

MultiMax 19-05-2014 22:25 2353297

снова здравствуйте! есть проблема с этим скриптом - при наличии в названии песни символа "&", скрипт не выполняется. Как поправить?

MultiMax 20-05-2014 09:43 2353442

Вложений: 1
  • broad.zip (351 bytes, скачиваний: 27)
Помогите советом пожалуйста! Есть специальный плеер, который выплевывает файл с названием текущего трека + последующих в плейлисте. Есть скрипт bat, который парсит этот файл и выплевывает текстовый с одной строчкой - Имя Артиста - Название песни. При наличии в названии песни значка &, скрипт не выполняется. Как это обойти?

Вот сам скрипт:

@echo off


setlocal
1>nul chcp 1251

0<broad.int set /p "string="

echo %string% | 1>nul 2>&1 findstr "B" || cd.>onair.txt && goto:eof

call:set %string:~14,255%

CHCP 65001|1>onair.txt echo %song%&utf-8
goto:eof

:set
set "song=%*"


Файл, который надо парсить, приложил

MultiMax 21-05-2014 21:22 2354123

есть кто?

MultiMax 26-05-2014 10:18 2355822

Вложений: 1
работает, только после названия песни выплевывает в текстовый файл путь и имя файла. обрубить бы это как-нибудь и оставить только Артист - Название песни... прикрепил...

kdolzhanskiy@vk 14-07-2014 11:30 2376293

Помогите пожалуйста с кодом. Есть логика, а навыков нет ;) Нужно из файлика Nowplay (в файле только одна строка - Исполнитель и название песни) вытаскивать в другой файл первые 8 символов плюс "2", делать перенос и повторять операцию, но уже со сдвигом на символ и так до конца строки. Результаты работы в новый файл. Это для работы RDS-кодера на радио.

То есть:

Доктор Дре - Она одна такая
Доктор Д 2
октор Др 2
ктор Дре 2
тор Дре 2
ор Дре - 2
р Дре - 2
Дре - О 2
Дре - Он 2
ре - Она 2
е - Она 2
- Она О 2
- Она Од 2 .... и.т.д.

Код однократного действия я нашел... а дальше швах!

Код:

@echo off
for /f "usebackq delims=" %%i in ("nawplay.txt") do set "first_string=%%i"& goto:#
:#
set "first_string=%first_string:~0,8% 2"
for /f "delims=^" %%i in ("%first_string:    =^%") do echo %%i>"1.txt"
exit /b


В идеале еще сделать в том же файле транслитерацию... но это уже будет просто опупенно

Код:

for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i"
    "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r"
    "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=a"
    "Б=b" "В=v" "Г=g" "Д=d" "Е=e" "Ж=zh" "З=z" "И=i" "К=k"
        "Л=l" "М=m" "Н=n" "О=o" "П=p" "Р=r" "С=s" "Т=t" "У=u"
        "Ф=f" "Х=x" "Ц=c" "Ч=4" "Ш=sh" "Щ=ch" "Ь='" "Ы=i" "Ъ='"
        "Э=e" "Ю=ju" "Я=ja") do (
    call set %~1=%%%~1:%%~a%%


kdolzhanskiy@vk 23-07-2014 13:33 2380198

Цитата:

Помогите пожалуйста с кодом. Есть логика, а навыков нет Нужно из файлика Nowplay (в файле только одна строка - Исполнитель и название песни) вытаскивать в другой файл первые 8 символов плюс "2", делать перенос и повторять операцию, но уже со сдвигом на символ и так до конца строки. Результаты работы в новый файл. Это для работы RDS-кодера на радио.

То есть:

Доктор Дре - Она одна такая
Доктор Д 2
октор Др 2
ктор Дре 2
тор Дре 2
ор Дре - 2
р Дре - 2
Дре - О 2
Дре - Он 2
ре - Она 2
е - Она 2
- Она О 2
- Она Од 2 .... и.т.д.

Код однократного действия я нашел... а дальше швах!
Задачу почти получилось решить выполнением кучи отдельных батников. Так 14 батников отвечают за распиливание строки на 14 кусков со сдвигом на символ и добавлением " 2". Правда чуть пришлось переделать хвостик ;) Получается 1.txt, 2.txt и т.д. до 14.txt
Код:

echo off
for /f "usebackq delims=" %%i in ("OnAir.txt") do set "first_string=%%i"& goto:#
:#

set "first_string=%first_string:~0,8%"
for /f "delims=^" %%i in ("%first_string:    =^%") do <nul set /p $WRT="%%i 2" >1.txt

exit /b

Затем 15 батник собирает из получившихся текстовиков один со строчками

Код:

@echo off
(
    type 1.txt
    echo:
    type 2.txt
        echo:
        type 3.txt
        echo:
        type 4.txt
        echo:
        type 5.txt
        echo:
        type 6.txt
        echo:
        type 7.txt
        echo:
        type 8.txt
        echo:
        type 9.txt
        echo:
        type 10.txt
        echo:
        type 11.txt
        echo:
        type 12.txt
        echo:
        type 13.txt
        echo:
        type 14.txt
)>C:\Default.txr

Все батники по очереди вызываются из одного call-ом.
Не смотря на мусорность конструкция работает. Все бы хорошо, но возникла проблема - если количества символов не хватает на создание 14 текстовиков - слить их не получается. Можно как то решить проблему со слиянием, если число файлов для него произвольное, но располагаться все должно столбиком?

Iska 23-07-2014 14:32 2380225

На WSH:
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strLine

Dim i


strSourceFile = "C:\Песочница\047\NowPlay.txt"
strDestFile  = "C:\Песочница\047\NowPlay2.txt"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FileExists(strSourceFile) Then
                With .OpenTextFile(strSourceFile)
                        strLine = .ReadLine()
                        .Close
                End With
               
                With .CreateTextFile(strDestFile, True)
                        For i = 1 To Len(strLine) - 8 + 1
                                .WriteLine Mid(strLine, i, 8) & " 2"
                        Next
                       
                        .Close
                End With
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0

По поводу транслитерации — Ваш набор неполон. Где «ё», где «й»?

MultiMax 20-06-2015 11:38 2520430

Здравствуйте! Уже 4 года гоняем скрипт! Все отлично, но вылез один баг. При звучании в эфире песни или программы без тега, скрипт выдает "~14", вместо пустоты :) Скрин прилагается, а также 2 файла, которые скрипт парсит. первый файл скопирован во время звучания в эфире размеченной песни, второй - неразмеченной. Возможно это можно как-то поправить?



Код:

@echo off

net use \\192.168.113.150\air\PLAYLISTS /user:domain\user pass /permision:no
copy \\192.168.113.150\air\PLAYLISTS\broad.int C:\script_streamtagname\broad.int


for /f "usebackq delims=" %%i in ("broad.int") do set "first_string=%%i"& goto:#
:#
set "first_string=%first_string:~14%"
for /f "delims=^" %%i in ("%first_string:    =^%") do echo %%i>"1.txt"
exit /b

Схема:
Есть эфирный компьютер с программой-плеером музыки. Программа выплевывает файл broad.int (копия файла внизу по ссылке), с описанием текущей песни, пути к ней, времени старта + последующие несколько песен в эфире. Скрипт стоит на втором компьютере, по сети копирует этот файл broad.int и копирует в папку со скриптом. NNCRON отслеживает изменение файла broad. int на удаленном компе и запускает батник, который копирует broad.int себе в папку и обрабатывает его, выплевывая текстовый файл с названием песни в эфире :)


ссылка на онлайн вещание, где запущен данный скрипт: http://86.57.151.4:8009/listen.pls


https://drive.google.com/file/d/0B2-...paV0NNYW8/view
Тут скрипт и 2 примера файла.

Foreigner 20-06-2015 15:44 2520477

Проверьте переменную %first_string%:
Код:

...
set "first_string=%first_string:~14%"
if "%first_string%"=="~14" set "first_string=Unknown track"
....


MultiMax 20-06-2015 16:06 2520485

сделал, тестируем..)

greg zakharov 21-06-2015 08:55 2520627

Видимо никого не смущают куцые возможности батников в отношении кодировок текстовых файлов... Задача сводилась по сути к:
Код:

@echo off
  setlocal&chcp [начальная_кодировка]>nul
    set /p fl=<broad.int
    set "fl=%fl:~14%"
    echo.%fl%>output.txt
  endlocal&chcp 866>nul
exit /b

С PowerShell решение задачи будет проще:
Код:

-join ($$=(gc broad.int)[0])[14..$$.length]

MultiMax 21-06-2015 11:22 2520663

поясните пожалуйста что вы имеете ввиду? скрипт, который вы кинули меняет кодировку?

Foreigner 21-06-2015 12:06 2520685

Цитата:

Цитата greg zakharov
Видимо никого не смущают куцые возможности батников в отношении кодировок текстовых файлов... »

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

Iska 21-06-2015 12:26 2520699

Цитата:

Цитата Foreigner
Кодировка здесь не имеет значения, файл на выходе будет в той же кодировке, что и на входе. »

Ну, тем не менее, файл там весьма занятный: с одной стороны — Unix'овский формат концов строк, с другой — символ с кодом 0x0 в середине строки :).

MultiMax 08-03-2017 14:14 2717642

Добрый день! использую один из скриптов, выложенных в этой теме! Все работает как часы :)

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

Если путь равен X:\Pogoda (тут расположены заставки погоды, фон для ведущего погоды) -- вывести слово "Прогноз погоды"
Если путь равен X:\News (тут расположены заставки новостей, фон для ведущего погоды) -- вывести слово "Новости"
Если путь равен X:\Reklama (тут расположены рекламные ролики) -- вывести слово "Реклама"


поведение скрипта: файл broad.int, который выплевывает радио плеер, копируется в локальную папку, обрабатывается скриптом. Скрипт смотрит на путь к песне в файле broad.int , если в он равен X:\Music_2015 --- выводим название песни и исполнителя, обрезая ненужные символы до и после. Если путь не равен X:\Music_2015, выводим пустоту в файл (команда nul). Задача следующая! Добавить возможность прописать условие!

Если путь равен X:\Music_2015 -- все остается как прежде, Артист - Название песни.
Если путь ИНОЙ или файл без названия (~14), выводить nul -- т.е. сохранить текущее поведение



Вот тело скрипта:
Код:

@echo off
net use X:\synadin\playlist /user:domain\user pass /permision:no
copy X:\synadin\playlist\broad.int D:\script_streamtagname\broad.int
0<broad.int Set /P "Str="
Set "Str=%Str:~14%"
Set "Str=%Str:  =$%"
For /F "Tokens=1* Delims=$" %%A In ("%Str%") Do Echo %%B|Find /i "X:\Music_2015" 1>nul 2>&1&&Echo.%%A>radiotext.txt||cd.>radiotext.txt
ping 127.0.0.1 -n 5 1>nul 2>&1&&call %0



Время: 17:53.

Время: 17:53.
© OSzone.net 2001-