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

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

semiono 26-11-2009 20:10 1280689

ResHacker.cmd
 
Пмогите написать батник для ResHacker.exe?
Мне надо чтоб файл лежал как обычно %ProgramFiles%\ResHacker\ResHacker.exe, но при этом корректно выполнялся в cmd.exe

Сначала, я просто накатал такое ResHacker.cmd:
@start C:\~\Apps\ResHacker\ResHacker.exe "%1" %*

( во-первых я лишь интуитивно понимаю смысл этого - "%*" )
Во-вторых, как мне показалось ResHacker игнорирует вольный ввод, и всё понимает буквально.

Вот его справка:
Command line scripts have 2 general forms:

1. Single commands:

Код:

ResHacker.exe command command_parameters
2. Multiple commands:
        ResHacker.exe -script scriptfile


Single Commands:

command and command_parameters:
  -add          ExeFile, SaveAsFile, ResourceFile, ResourceMask
  -addskip      ExeFile, SaveAsFile, ResourceFile, ResourceMask
  -addoverwrite  ExeFile, SaveAsFile, ResourceFile, ResourceMask
  -modify        ExeFile, SaveAsFile, ResourceFile, ResourceMask

  -extract      ExeFile, ResourceFile, ResourceMask
  -delete        ExeFile, SaveAsFile, ResourceMask

Нужно нечто такое
Код:

@if "%1"=="" C:\~\Microsoft.NET\Framework\v2.0.50727\ilasm.exe & goto sh
@C:\~\Microsoft.NET\Framework\v2.0.50727\ilasm.exe "%1" %*
:sh

чтобы переменное количество параметров передавалось соответственно...

В двух словах, как зделать чтоб в одном случае было "%1" "%2", а в другом "%1" "%2" "%3" "%4" в зависимости от ввода?

semiono 27-11-2009 18:17 1281447

Парни, вы что не умеете скрипты писать, неповерю? Или я что-то опять непонятное пишу?
вот два параметра комманд строки:
ResHacker.exe -script scriptfile
а вот пять
ResHacker.exe -add ExeFile, SaveAsFile, ResourceFile, ResourceMask
надо зделать так, чтоб батник передавал программе именно вводимое юзером количество параметров.
всего вариантов два! надо как-то это через IF логику организвать, я неумю :(
??
упс, я не прав, вот третьий вариант ещё {-extract ExeFile, ResourceFile, ResourceMask}
если параметров нет, то должен просто запуститься бинарь
@start %ProgramFiles%\ResHacker\ResHacker.exe
впрочем эту строку я и сам добавить могу, это уже не важно.

Sham 28-11-2009 03:48 1281815

Цитата:

Цитата semiono
чтоб батник передавал программе именно вводимое юзером количество параметров. »

через параметры командной строки батника или путем запроса ввода с клавиатуры?

semiono 28-11-2009 16:40 1282053

я не очень Вас понимаю. лишь бы работало! чем проще тем лучше...
у меня есть "традиция", я ко всем программам %ProgramFiles% храню батники в system32 на всякий случай,
но обычно там много не надо бывает, просто запуск из cmd.exe
А в данном случае ResHacker имеет поддержку коммандной строки и поэтому хочется чтобы всё это тоже работало. И возможно для других прог тоже пригодиться такое знание!
И было бы удобно тогда не вводя путь к ResHacker запустить его с параметрами в любой текущей директории...

Sham 28-11-2009 18:34 1282111

Цитата:

Цитата semiono
я не очень Вас понимаю. лишь бы работало! »

как параметры батнику то передаются? При запуске с параметрами (file.bat /параметр) или после запуска батника в окно нужно что-то вводить?

Вам наверно проще сделать несколько ярлыков с разными параметрами запуска.

semiono 28-11-2009 18:49 1282115

я всё ввожу в cmd.exe, либо ввод должен осуществляться любым файлом - temp.cmd, (не ResHacker.cmd)
так как будто он работает с обычным ...\ResHacker.exe
(просто чтобы не писать каждый раз пути к ...\ResHacker.exe в консоли и в скриптах temp.cmd.)
Цитата:

Цитата Sham
Вам наверно проще сделать несколько ярлыков с разными параметрами запуска. »

это как бы графический метод для десктопа! меня же интересует работа с консолью.
хотя можно написать много вариантов ResHacker1.cmd, и вызывать нужный
:) но это же не дело совсем, при этом надо запомнить какой для каких целей ))

Кстати, может вот так ....\ResHacker.exe "%1" "%2" "%3" "%4" "%5" "%6" "%7" и ещё и >NULL в конце добавить? Я пока пишу, надо тоже проверить... Разве лишнии параметры не должны игнорироваться? Или они будут как ввод восприниматься?
И для чего >null вообще обычно используют?

Мой пример выше для ilasm.exe хорошо показывает, что я хочу, но только он не совершенный.
ResHacker.cmd - это просто пернаправлятель всего ввода к самому файлу...

Iska 28-11-2009 19:40 1282157

semiono, чем не устраивает:
* добавление путей в Path;
* если так любите команду start «xxx» — добавление приложения в подраздел «SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths» разделов HKLM/HKCU;
* создание aliases с помощью «doskey.exe»?

Зачем, в конце концов, как-то извращаться в пакетном файле, если банальный %* передаст весь набор параметров, сколько бы их ни было:
Код:

@echo off

echo.%*
"C:\Program Files\Resource Hacker\ResHacker.exe" %*

Цитата:

Код:

C:\Песочница\39>ResHack.cmd "1" 2 "3 4"
"1" 2 "3 4"



semiono 28-11-2009 20:52 1282207

А так значит моя ошибка была в этом: "%1" %*
Понял! Достаточно только этого: %*
Цитата:

Цитата Iska
Зачем, в конце концов, как-то извращаться в пакетном файле, если банальный %* »

Вот и я об этом! Ну я же не знал. :)

\CurrentVersion\App Paths у меня итак всегда включен, так как я всё что только есть всегда использую!
Но это для меню Run подходит, но не для cmd.exe.
Всмысле, когда нет параметров тогда start самособой актуально и для батников.

Спасибо!

Iska 29-11-2009 17:47 1282656

Цитата:

Цитата semiono
\CurrentVersion\App Paths у меня итак всегда включен, так как я всё что только есть всегда использую!
Но это для меню Run подходит, но не для cmd.exe.
Всмысле, когда нет параметров тогда start самособой актуально и для батников.

Вы не правы. Команда «start» использует «App Paths» (я подозреваю, что тут пользуется механизм ShellExecute(), но специально не проверял).

Попробуйте добавить содержимое такого файла в реестр:
ResHacker.exe.reg
Код:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe]
@="C:\\Program Files\\Resource Hacker\\ResHacker.exe"

и попробуйте выполнить такой пакетный файл:
DemoStart.cmd
Код:

@echo on
ResHacker.exe
start "" ResHacker.exe

На попытку выполнить «ResHacker.exe» из пакетного файла — Вы увидите отлуп:
Цитата:

"ResHacker.exe" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
а вот «start "" ResHacker.exe» запустит исполняемый файл, указанный в параметре по умолчанию в «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe».

Точно так же, ничто не мешает использовать таким образом параметры, хоть в окне «Run», хоть в командной строке в команде «start».

Однако, на мой взгляд, для командной строки удобнее пользовать макросы doskey.exe. Создаёте, например, такой макрос:
Код:

doskey rh="C:\Program Files\Resource Hacker\ResHacker.exe" $*
Далее можно просто пользовать его из командной строки (не из пакетных файлов) наподобие:
Код:

rh param1 param2 … paramN
Макрос можно сохранить в файл и загружать при необходимости. Описание смотрите в справке:
Код:

hh.exe mk:@MSITStore:C:\WINDOWS\Help\ntcmds.chm::/doskey.htm
и в: CMD/BAT: Макросы DOSKEY — полезная вещь, которую не многие используют.

Точно так же, если Вы постоянно работаете со скриптами Resource Hacker'а, можно облегчить себе жизнь следующим образом. Для этого следует завести для этих скриптов некое незанятое расширение (например, у меня не занято «.rh»). Зарегистрируем такой тип файлов и ассоциируем его с исполняемым файлом «ResHacker.exe»:
Код:

assoc .rh=ResourceHackerScript
ftype ResourceHackerScript="C:\Program Files\Resource Hacker\ResHacker.exe" -script "%1"

В принципе, этого уже достаточно для работы (можно ещё, конечно, поменять иконку, дать описание, создать дополнительные глаголы «Edit/Print/etc.» и т.п., но сие уже рюшечки). Создаёте некий скрипт для Resource Hacker'а, даёте ему расширение «.rh» (например «c:\My Scripts\My RH Script.rh»). После этого будет, например, работать такая команда:
Код:

start "" "c:\My Scripts\My RH Script.rh"
При этом будет опосредованно запущена такая команда:
Код:

"C:\Program Files\Resource Hacker\ResHacker.exe" -script "c:\My Scripts\My RH Script.rh"

semiono 01-12-2009 18:52 1284392

Цитата:

Цитата Iska
На попытку выполнить «ResHacker.exe» из пакетного файла — Вы увидите отлуп: »

Вы имеете ввиду Ваш пакетный файл DemoStart.cmd, у меня открывается ResHacker.exe норамльно!
Хотя я не понял что значит "" здесь: start "" ResHacker.exe?

Может это Вы имели ввиду: start "C:\~\Apps\ResHacker\ResHacker.exe"

Ладно это не важно!

Хочу пояснить немножко суть всего. Я делаю самодельные инсталяторы программ.
При этом взял за правило использовать все фитчи системы.
То-есть установленное приложение, любое должно сразу быть готово запускаться
из Пуск > Выполнить, из консоли CMD.exe, из значка My Computer итп.
особо изощрённых способов не предполагается, но то что заложенно в системе то и используем.
Это я к тому что мне много таких батников надо, для всех программ, ResHacker это частный случай.

Я подсмотрел в реестре такую запись "%1" %* и не разобравшись стал юзать,
но как стало понятно позже, что это не удачный пример...
Хотя я задумался, а зачем там в реестре ms так написали?

Но похоже, что там был случай с точно определённым вызовом, то-есть точно 1 свитчер плюс %*

В моём же случае свитчер может вообще отсутствовать, в этом и проблемма... наверное?

Правда не ясно почему неправильно работает при 1 + несколько ключей? Но не важно!

Главное я понял такая маска %* работает действительно универсально!
Даже не знаю будет ли она обрабатыать пустой ввод, но по любому хорошо уже!

App Paths, как говорил уже ранее у меня всегда задействован, но возможно что
тут может возникнуть путаница в отношении CMD.exe промпта? Не знаю, но это всё неочевидно.
Не ясно какая именно ситуация... Вообще-то батник не противоречит пути в реестре, посему нет проблемы! ?

DOSKEY никогда не юзал, весьма интересно, хотя надо почитать, сразу не определиться насколько полезно...
Но определённо хорошо то, что это прога из дистрибутива windows, значит всегда есть и везде!

Как резюм хочу добавить, что тут ключевым является максимально юзать комманд строку,
вместо пакетного управления. Всё что пока можно втиснуть в комманду грубо говоря.

offtop: самый интересный с точки зрения исследования комманд строки это Directory Opus,
я глянул в хелп и увидел там тучи комманд, но у меня так и не заработало такое
"C:\~\Apps\DOpus\dopusrt.exe" /cmd Go "C:\~\system32" OPENINRIGHT (подсказка с его форума)
хотя справедливо и такое
"C:\~\Apps\DOpus\dopusrt.exe" /cmd Go PATH "C:\~\system32" OPENINRIGHT
в справке вообще написано OPENINRIGHT/S
одно только радует, это богатство комманд строки в проге! :)

Iska 01-12-2009 22:21 1284611

Цитата:

Цитата semiono
Вы имеете ввиду Ваш пакетный файл DemoStart.cmd,…

Да.
Цитата:

Цитата semiono
…у меня открывается ResHacker.exe норамльно!

Первым вызовом («ResHacker.exe»)? Если Вы его не добавили путь в «Path» — не должно такого быть. Что-то Вы не договариваете. Сработает только вторая команда из пакетного файла — «start "" ResHacker.exe».
Цитата:

Цитата semiono
Хотя я не понял что значит "" здесь: start "" ResHacker.exe? Может это Вы имели ввиду: start "C:\~\Apps\ResHacker\ResHacker.exe"

Нет, не это. Зачастую путь в кавычках команда «start» воспринимает как заголовок окна, хоть тот числится как необязательный параметр:
Цитата:

Цитата Help Start
Синтаксис:
start ["заголовок"] [/dпуть] [/i] [/min]…

Потому я предпочитаю помещать такого рода «заглушку» в виде пустого заголовка даже тогда, когда путь указывается без кавычек.

Цитата:

Цитата semiono
offtop: самый интересный с точки зрения исследования комманд строки это Directory Opus,

Боюсь Вас разочаровать, но сие не так. Воздержусь от язвительных комментариев в адрес «Directory Opus», но если нужна консоль и реальная командная строка под Win32/64 — это «Far Manager».

semiono 02-12-2009 00:11 1284678

Far - это даже и не обсуждается. :)
Но я имел ввиду explorer - подобный "проводник", TotalCmd я не люблю... при всех его фитчах, слишком серо...
но спорить нет смысла, просто факт, что dopus 100% заточен под win7 о чём было заявленно.
А фар рулит! Yes! даже при моём скромном опыте в шелах

Цитата:

Цитата Iska
Если Вы его не добавили путь в «Path» — не должно такого быть. »

ась? :)
Iska, у меня в реестре всегда две записи, может об этом речь?
Код:

HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe",,0x0,"C:\~\Apps\ResHacker\ResHacker.exe"
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe","Path",0x0,"C:\~\Apps\ResHacker"

path я тоже прописываю в регистри!


сейчас ещё один косяк исправил, вместо старого моего батника (Inno Setup)
Код:

@if "%1"=="" C:\~\Apps\Innosup\ISCC.exe & goto sh
@C:\~\Apps\Innosup\ISCC.exe "%1" %*
:sh
rem  0_0

достаточно было того:
Код:

@C:\~\Apps\Innosup\ISCC.exe %*
:)

Iska 02-12-2009 07:51 1284789

Цитата:

Цитата semiono
Но я имел ввиду explorer - подобный "проводник", TotalCmd я не люблю... при всех его фитчах, слишком серо...
но спорить нет смысла, просто факт, что dopus 100% заточен под win7 о чём было заявленно. »

Ясно.
Цитата:

Цитата semiono
Цитата:

Цитата Iska
Если Вы его не добавили путь в «Path» — не должно такого быть.

ась?

Описался :). В оригинале подразумевалось: «Если Вы только не добавили его путь в [переменную окружения] «PATH» — не должно такого быть. … Сработает только вторая команда из пакетного файла — «start "" ResHacker.exe».
Цитата:

Цитата semiono
Iska, у меня в реестре всегда две записи, может об этом речь?
Код:

HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe",,0x0,"C:\~\Apps\ResHacker\ResHacker.exe"
HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\ResHacker.exe","Path",0x0,"C:\~\Apps\ResHacker"

path я тоже прописываю в регистри! »

Я понял так, что указание «Path» в «App Paths» требуется тогда, когда требуемые библиотеки расположены по иному пути, нежели исполняемый файл (и не в путях, перечисленных в «PATH»): Errors in Windows XP applications that start by using the ShellExecute() function. Ну, и, дополнительно, если потребуется:
Цитата:

Windows XP adds the path value, if it exists, to the PATH environment variable, if you use the ShellExecute() function to start your program.
для приложения и его дочерних процессов.

myhouse_1991 27-07-2010 20:43 1461733

Цитата:

\CurrentVersion\App Paths у меня итак всегда включен, так как я всё что только есть всегда использую!
Но это для меню Run подходит, но не для cmd.exe.
Лучше поздно, чем никогда.
Недавно я изучал запуск функций из DLL файлов с помощью RUNDLL32.EXE и там есть одна DLL'ка - shell32.dll, которая как раз отвечает и за "Выполнить..." (функция ShellExec_RunDLL).

Если создать run.bat, положить в %windir% и вписать следующее:
Код:

@echo off
rundll32.exe shell32.dll, ShellExec_RunDLL %*

То получим чистую копию "Выполнить..." в командной строке

Примеры использования:
run explorer.exe /separate
run http://127.0.0.1
run msconfig


Время: 19:09.

Время: 19:09.
© OSzone.net 2001-