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

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

Tosyk 12-11-2010 18:20 1541102

Пакетное преобразование данных с помощью cmd
 
ЕСТЬ: файлы с рсширением *.psr, они располагаются в разных папках и являются архивами.

ЕСТЬ: первая программа: psr-tool.exe, которая умеет дампить данные из *.psr в файлы *.tty командой:

psr-tool.exe test-file.psr

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

ЕСТЬ: вторая программа: tty-tool.exe, которая преобразует параметры внутри *.tty файла командой

tty-tool.exe extracted-test01.tty converted-test01.tty -option

и записывает его в новый converted-test01.tty (это имя пишется вручную). extracted-test01.tty - файл источник, "-option" - дополнительные опции.


НУЖНО: чтобы бат-файл дампил программой psr-tool.exe файлы в папку имеющую имя конвертируемого файла:

test-file.psr дампился в test-file!

В папке test-file файлы с расширением *.tty конвертировались бы программой tty-tool.exe и на выходе получались бы файлы *.tty с теми же именами что и были, но уже конвертированные, исходные же *.tty удалялись бы.

Нужно очень, сам не могу предусмотреть и отладить весь процесс, сделать так сказать его универсальным.

Если нужно, я могу более детально описать схему.

NiOl 13-11-2010 00:51 1541420

Честно говоря при простоте задания пришлось перечитать раза 4, пока не понял всех действий... ;)

Запускаете из любого каталога, "батник" сканирует его вглубь по подкаталогам и обрабатывает все найденные *.psr
* полноценно оттестить нет возможности - сначала попробуйте на копиях файлов!

Код:

@echo off
set Wrk="%~n0.tmp"
for /f "tokens=1 delims=" %%A in ('dir *.PSR /a-d /b /on /s') do call :UnPack "%%A"
exit
:UnPack
set /p T=UnPacking %1<nul
md "%~dpn1" 2>nul||(echo  - Failed!&exit /b)
echo.
cd "%~dpn1"
psr-tool.exe %1
for %%F in (*.tty) do (
tty-tool.exe "%%F" %Wrk% -option ||(echo - Error coverting "%%F"&exit /b)
del /f /q "%%F" >nul 2>nul
ren %Wrk% "%%F" 2>nul
)
exit /b


Tosyk 13-11-2010 18:39 1541911

ООО, как круто! Как быстро, спасибо.

Однако, он не работает.

У меня для теста есть папки: FOLDER01 FOLD02 DIR03

В каждой папке соответственно по одному файлу: file01.psr failo02.psr fille03.psr

Я запускаю скрипт и он создаёт папки (рядом с каждый *.psr файлом) с именами FILE01 FAILO02 FILLE03 и закрывается.

Вот в чём может быть проблема?

El Sanchez 13-11-2010 20:34 1542003

Цитата:

Цитата Tosyk
Вот в чём может быть проблема? »

Tosyk, вероятно система не может найти путь к psr-tool.exe и tty-tool.exe.
Вариант №2
Код:

@Echo Off
Set Source=C:\Source

For /F "Tokens=*" %%A In ('Dir /B /S "%Source%\*.psr"') Do (
        MD "%%~dpnA" 2>nul&&psr-tool.exe "%%A"
        For %%B In ("%%~dpA*.tty") Do tty-tool.exe "%%B" "%%~dpB_%%~nxB" -option&&Move /Y "%%~dpB_%%~nxB" "%%~dpnA\%%~nxB"
)

psr-tool.exe и tty-tool.exe должны лежать рядом с батником либо в одном из каталогов системной переменной %PATH%

Tosyk 13-11-2010 20:41 1542008

Цитата:

Цитата El Sanchez
@Echo Off
Set Source=C:\Source
For /F "Tokens=*" %%A In ('Dir /B /S "%Source%\*.psr"') Do (
MD "%%~dpnA" 2>nul&&psr-tool.exe "%%A"
For %%B In ("%%~dpA*.tty") Do tty-tool.exe "%%B" "%%~dpB_%%~nxB" -option&&Move /Y "%%~dpB_%%~nxB" "%%~dpnA\%%~nxB"
) »

Но ваш вариант мне говорит не найден указаный путь.

меня смущает Set Source=C:\Source, скрипт должен работать из любой папки вглубь по каталогам.

El Sanchez 13-11-2010 22:08 1542101

Цитата:

Цитата Tosyk
меня смущает Set Source=C:\Source, скрипт должен работать из любой папки вглубь по каталогам. »

Tosyk, вместо C:\Source пишете свой путь с папками с psr-файлами. С:\Source - это путь для примера

Tosyk 13-11-2010 22:26 1542109

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

Anonymоus 14-11-2010 07:45 1542285

Tosyk, В таком случае, вместо Set Source=Абсолютный путь пишете Set Source=.\ (относительный путь), либо Set Source=%CD% (оба примера будут работать с той директорией, откуда был запущен скрипт)

Tosyk 14-11-2010 08:06 1542287

Anonymоus, да действительно происходит дамп tty файлов, но в папку расположения скрипта, а нужно

Цитата:

Цитата Tosyk
НУЖНО: чтобы бат-файл дампил программой psr-tool.exe файлы в папку имеющую имя конвертируемого файла:
test-file.psr дампился в test-file!
В папке test-file файлы с расширением *.tty конвертировались бы программой tty-tool.exe и на выходе получались бы файлы *.tty с теми же именами что и были, но уже конвертированные, исходные же *.tty удалялись бы. »

т.е. происходит только

Цитата:

Цитата Tosyk
НУЖНО: чтобы бат-файл дампил программой psr-tool.exe файлы в папку »

и дампит он их в папку со скриптом

да, кстати, папки с именами *.psr фалов последним вариантом создаются!

El Sanchez 14-11-2010 11:47 1542351

Цитата:

Цитата Tosyk
происходит дамп tty файлов, но в папку расположения скрипта »

Tosyk, значит, что psr-файлы находятся рядом со скриптом.
Цитата:

Цитата Tosyk
НУЖНО: чтобы бат-файл дампил программой psr-tool.exe файлы в папку имеющую имя конвертируемого файла »

Tosyk, тогда подробней про синтаксис psr-tool.exe.
Из psr-tool.exe test-file.psr следует, что tty-файл(ы) будет рядом с psr-файлом, я не вижу как указывать выходную директорию для tty-файлов.

Теперь, чтобы было все понятно по скрипту, разбор полетов:
  • For /F "Tokens=*" %%A In ('Dir /B /S "%Source%\*.psr"') Do - первый цикл ищет psr-файлы в текущем и во вложенных каталогах и поочередно присваивает переменной %A полный путь к найденному psr-файлу (для примера первый найденный файл C:\Source\Dir1\test.psr)
  • MD "%%~dpnA" 2>nul - модификатор ~dpn выделит из переменной %A все, кроме расширения, т.е. получим имя папки для команды MD (для нашего примера это MD "C:\Source\Dir1\test"). Будет создана папка рядом с psr-файлом.
  • psr-tool.exe "%%A" - судя по синтаксису распаковываем psr-файл в ту же директорию, где и psr-файл (psr-tool.exe "C:\Source\Dir1\test.psr"). В итоге рядом с psr-файлом, буде(у)т лежать tty-файл(ы) C:\Source\Dir1\test.tty.
  • For %%B In ("%%~dpA*.tty") Do tty-tool.exe "%%B" "%%~dpB_%%~nxB" -option - второй цикл: все tty-файлы в директории c psr- и распакованным tty-файлами (%%~dpA = C:\Source\Dir1\) прогоняем через утилиту tty-tool.exe (где %%B - путь к найденному tty-файлу C:\Source\Dir1\test.tty, %%~dpB_%%~nxB - временный выходной tty-файл C:\Source\Dir1\_test.tty).
  • Move /Y "%%~dpB_%%~nxB" "%%~dpnA\%%~nxB" - если конвертация прошла успешно (&&), то переместим временный файл %%~dpB_%%~nxB (C:\Source\Dir1\_test.tty) в ранее созданную папку %%~dpnA (C:\Source\Dir1\test) с переименованием %%~nxB (test.tty), т.е. Move /Y "C:\Source\Dir1\_test.tty" "C:\Source\Dir1\test\test.tty".

Tosyk 14-11-2010 13:28 1542405

El Sanchez, в принципе по разбору полётов всё понятно, и должно работать, но оно не работает.

Я уже писал как тестирую:

Цитата:

Цитата Tosyk
У меня для теста есть папки: FOLDER01 FOLD02 DIR03
В каждой папке соответственно по одному файлу: file01.psr failo02.psr fille03.psr»

Плюс рядом с упомянутыми папками у меня лежат программы psr-tool.exe, tty-файлы и собственно сам скрипт

Цитата:

Цитата Tosyk
Я запускаю скрипт и он создаёт папки (рядом с каждый *.psr файлом) с именами FILE01 FAILO02 FILLE03 и»

Цитата:

Цитата Tosyk
происходит дамп tty файлов, но в папку расположения скрипта »


p.s.: Не думаю, что это важно, но к программе psr-tool.exe прилагается ещё пара библиотек *.dll.

El Sanchez 14-11-2010 14:06 1542421

Цитата:

Цитата Tosyk
Плюс рядом с упомянутыми папками у меня лежат программы psr-tool.exe, tty-файлы и собственно сам скрипт »

Tosyk, что за tty-файлы рядом со скриптом? Вы ведь обрабатываете psr-файлы для получения tty-файлов и изначально их не должно существовать, хотя на работу скрипта они не влияют.
Цитата:

Цитата Tosyk
происходит дамп tty файлов, но в папку расположения скрипта »

Значит psr-tool.exe распаковывает psr-файлы не в папку с psr-файлом, а в ту, в которой находится сама утилита. Поэтому второй раз пишу
Цитата:

Цитата El Sanchez
подробней про синтаксис psr-tool.exe. »

Цитата:

Цитата Tosyk
Не думаю, что это важно, но к программе psr-tool.exe прилагается ещё пара библиотек *.dll. »

Должны лежать рядом с psr-tool.exe

Tosyk 14-11-2010 14:23 1542434

Цитата:

Цитата Tosyk
умеет дампить данные из *.psr в файлы *.tty командой:
psr-tool.exe test-file.psr »

если я правильно понимаю это и есть синтаксис, вот это программа и умеет, больше ничего

El Sanchez 14-11-2010 14:41 1542451

Tosyk, давайте для эксперимента сделаем пробную распаковку. Выполните
Код:

psr-tool.exe FOLDER01\file01.psr
и скажите где будут распакованные tty-файлы - в папке FOLDER01 или рядом с psr-tool.exe

Tosyk 14-11-2010 14:45 1542455

Цитата:

Цитата El Sanchez
Tosyk, давайте для эксперимента сделаем пробную распаковку »

Распаковка произошла в папку с psr-tool.exe

El Sanchez 14-11-2010 17:03 1542523

Tosyk, тогда
Код:

@Echo Off
For /F "Tokens=*" %%A In ('Dir /B /S *.psr') Do (
        MD "%%~dpnA" 2>nul&&psr-tool.exe "%%A"
        For %%B In (*.tty) Do tty-tool.exe "%%B" "%%~dpnA\%%B" -option&&Del /F /Q *.tty 2>nul
)


Tosyk 14-11-2010 17:10 1542528

ООО, вот прогресс!! Правда есть одна незадача.

Цитата:

Цитата Tosyk
на выходе получается *.tty файл, его имя берётся программой из источника test-file.psr и может быть каким угодно »

в *.psr файлах бывает несколько *.tty файлов, и скрипт распаковывает их, но преобразовывает только первый из них, а остальные удаляет.

El Sanchez 14-11-2010 18:35 1542574

Tosyk, пардон. Нужны либо скобки:
Код:

(For %%B In (*.tty) Do tty-tool.exe "%%B" "%%~dpnA\%%B" -option)&&Del /F /Q *.tty 2>nul
либо перенести команду Del на новую строку:
Код:

For %%B In (*.tty) Do tty-tool.exe "%%B" "%%~dpnA\%%B" -option
Del /F /Q *.tty 2>nul


Tosyk 14-11-2010 18:55 1542584

воо, всё отлично! Спасибо огромное!

а как добавить операцию для уже преобразованных *.tty файлов? типа как вот это

Код:

For %%B In (*.tty) Do tty-tool.exe "%%B" "%%~dpnA\%%B" -option
но с дальнейшим удалением старых.

NiOl 16-11-2010 00:29 1543598

Цитата:

Цитата Tosyk
ООО, как круто! Как быстро, спасибо.
Однако, он не работает. »

- какой неожиданный поворот повествования! ;)

вероятно стоит прописать полный путь к командам psr-tool.exe и tty-tool.exe...
если не поможет - перед командой exit, что в середине скрипта (но не exit /b) поставте команду pause, в первой строке заремируйте команду @Echo off и то, что окажется на экране в результате теста - скопируйте сюда, попробую понять свою ошибку.

Tosyk 25-11-2010 19:41 1551548

Код:

For /F "Tokens=*" %%A In ('Dir /B /S *.psr') Do (
        MD "%%~dpnA" 2>nul&&psr-tool.exe "%%A"
        For %%B In (*.tty) Do tty-tool.exe "%%B" "%%~dpnA\%%B" -option
        Del /F /Q *.tty 2>nul
        psr-extractor.exe -e ""%%~dpnA"" "%%A"
        )

For /F "Tokens=*" %%D In ('Dir /B /S *.bin') Do (del %%D)
For /F "Tokens=*" %%C In ('Dir /B /S *.xml') Do (del %%C)
For /F "Tokens=*" %%F In ('Dir /B /S *.fsb') Do (del %%F)

Вот по такой схеме всё работает, я добавил ещё один инструмент, он распаковывает *.psr файлы полностью (psr-tool.exe дампит только определённый файл - *.tty)

Код:

psr-extractor.exe -e ""%%~dpnA"" "%%A"
psr-extractor.exe работает так:

psr-extractor.exe -e <"путь для извлечения"> <сам файл *.psr>

Код:

For /F "Tokens=*" %%D In ('Dir /B /S *.bin') Do (del %%D)
For /F "Tokens=*" %%C In ('Dir /B /S *.xml') Do (del %%C)
For /F "Tokens=*" %%F In ('Dir /B /S *.fsb') Do (del %%F)

Вроде как сделал, чтобы этими командами удалялись лишние файлы после распаковки программой psr-extractor.exe. Вроде работает.

Но есть проблема: если в пути есть пробелы, то psr-extractor.exe не работает.

Как это можно исправить?

El Sanchez 26-11-2010 14:02 1552078

Цитата:

Цитата Tosyk
For /F "Tokens=*" %%D In ('Dir /B /S *.bin') Do (del %%D)
For /F "Tokens=*" %%C In ('Dir /B /S *.xml') Do (del %%C)
For /F "Tokens=*" %%F In ('Dir /B /S *.fsb') Do (del %%F) »

Tosyk, это все можно заменить на:
Код:

Del /S /F /Q *.bin *.xml *.fsb 2>nul
Цитата:

Цитата Tosyk
Но есть проблема: если в пути есть пробелы, то psr-extractor.exe не работает »

Вместо
Цитата:

Цитата Tosyk
psr-extractor.exe -e ""%%~dpnA"" "%%A" »

нужно
Код:

psr-extractor.exe -e "%%~dpnA" "%%A"
, т.е. не удваивайте двойные кавычки

Tosyk 26-11-2010 14:13 1552085

Цитата:

Цитата El Sanchez
, т.е. не удваивайте двойные кавычки »

А я пробЫвал, но та же история! Файлы не распаковываются.

ДОБАВКА:
Причём если делать через командную строку (но не использовать полные пути) то всё работает даже если программа запускается с рабочего стола.


Время: 10:32.

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