Страница 1 из 2
Портативные ярлыки или универсальный путь
Добавлено: 11.03.2008, 00:46
NetSkipper
Имеется USB-флешка, на которой есть несколько портативныx программ. Программы расставлены в папкаx, а в корень флешки я вывел ярлыки. Вот тут-то и проблема, на разныx компьютераx флешка получает разную букву, по этому ярлыки разумется не буду работать.
Так же есть некоторые программы которы не предназначены для работы на флешке но тем не менее работаю отлично, но опять таки же, имеют настройки которые зависят от буквы драйва.
Например:
Код: Выделить всё
[Directories]
BinDir=X:\Dev-C++\Bin\
CDir=X:\Dev-C++\Include\
CppDir=X:\Dev-C++\Include\G++;X:\Dev-C++\Include\
LibDir=X:\Dev-C++\Lib\
Собственно вопрос, можно ли как-то прописать параметры ярлыка/файла настроек так что не была зависимость от буквы драйва?
Добавлено: 11.03.2008, 08:48
zeevik_k
Попробуй без букв драйва:
Код: Выделить всё
[Directories]
BinDir=\Dev-C++\Bin\
CDir=\Dev-C++\Include\
CppDir=\Dev-C++\Include\G++;\Dev-C++\Include\
LibDir=\Dev-C++\Lib\
Добавлено: 11.03.2008, 08:58
BigWig
NetSkipper
1. Попробуй использовать не ярлыки, а батники (batch files). Напимер, если на флешке, есть файл
X:\Dev-C++\Bin\Foo.exe, в корне флешки создай файл
Foo.bat с единственной строкой:
Разумеется, при запуске этого батника мелькнет консольное окошко.
2. Для конфигурационных файлов попробуй использовать только относительные пути ( в зависимости из какой директории вызывается программа). Если программа вызывается из батника, как в предыдущем примере, то к комманде запуска добавь ключ /D, который определяет стартовую директорию:
Код: Выделить всё
start /D.\Dev-C++\Bin\ .\Dev-C++\Bin\Foo.exe
Теперь в конфигурационном файле пути измени на следующий манер:
Код: Выделить всё
[Directories]
BinDir=.\
CDir=..\Include\
CppDir=..\Include\G++;..\Include\
LibDir=..\Lib\
Если в имени директории или файла есть пробел - незабудь обрамить это имя кавычками.
Добавлено спустя 2 минуты 19 секунд:
zeevik_k
Как правило, такая запись без бувы диска подразумевает диск С:
Добавлено: 11.03.2008, 13:37
N_T
Букву диска определить не сложно. Например вот так, (первое, что пришло в голову):
Поставь в автозапуск на флэшку бат-файл:
Код: Выделить всё
@Echo off
For %%a In (c d e f g h i j k l m n o p q r s t u v w x y z) Do If Exist %%a:\12345.678 Set flash=%%a:
Echo флэшка под именем %flash%
А в корень флэшки положи пустой файлик с именем 12345.678 (типа метки)
(или используй что-нибудь из того, что на флэшке уже есть, только пооригинальнее, чтобы случайно на других дисках такого не оказалось)
Ну а потом используй переменную %flash% в нужных целях. Например припиши её к path, или запускай проги через бат-файлы, путь в которых прописывай с её использованием.
В работоспособности .ini файлов не уверен. А попробовать сейчас негде...
PS обрати внимание, что строка №3 это продолжение строки №2
Добавлено: 11.03.2008, 13:54
NetSkipper
BigWig, большое спасибо, попробую.
N_T, то есть я смогу использовать ярлыки? Если честно не совсем понял. Можно пожалуйста живой пример по параметрам которые я описал ниже?
Добавлено: 11.03.2008, 14:05
N_T
NetSkipper писал(а):N_T, то есть я смогу использовать ярлыки? Если честно не совсем понял. Можно пожалуйста живой пример
Например, для запуска программы
вместо ярлыка пишешь бат-файл следующего содержимого:
И кликаешь не по ярлыку, а по бат-файлу. На секунду мелькнет окно консоли (при желании можно и от этого избавиться), и запустится программа.
Вообще твой вопрос - это 2 в 1. Как запускать программы с "неизвестной буквы", и как "неизвестную букву" прописать в ini файлах для СРР. Вот про использование предложенного способа для ответа на 2-ой вопрос я не ручаюсь. Надо попробовать.
Добавлено: 11.03.2008, 14:35
NetSkipper
N_T писал(а): На секунду мелькнет окно консоли (при желании можно и от этого избавиться)
Не подскажешь как?
Добавлено: 11.03.2008, 15:49
N_T
NetSkipper писал(а):Не подскажешь как?
Почему ж не подсказать
Создаешь скрипт, например hide.js
Код: Выделить всё
var WSHShell = WScript.CreateObject("WScript.Shell");
WSHShell.Run("123.bat",0);
123.bat - бат-файл, который будем запускать.
Затем помещаешь hide.js и 123.bat в sfx архив.
В коментарий архива вписываешь:
Код: Выделить всё
Setup=hide.js
TempMode
Silent=1
Overwrite=1
Ну и теперь кликаешь по получившемуся экзешнику

PS где-то я уже встречал такой вопрос. Вроде на ФФ. Не ты задавал?
Добавлено: 11.03.2008, 15:58
NetSkipper
N_T, к сожалению твой способ не работает с .ini файлами.
Портативная Опера тоже не работает, так как там уже есть какой-то .
exe файл который проделывает именно это. То есть берет букву драйва и изменяет настройки в Опере.
А так работает отлично. Спасибо!
N_T писал(а):PS где-то я уже встречал такой вопрос. Вроде на ФФ. Не ты задавал?
Не я. Меня там нет уже давно
BigWig, твой способ работает отлично! Спасибо!
Правда маленькая ошибочка.
Вот такая конфигурация у меня сработала: (то есть по одной точке)
Dev-C++:
batch-file:
Код: Выделить всё
start /D.\Programming\Dev-C++\ .\Programming\Dev-C++\DevCpp.exe
ini-file:
Код: Выделить всё
[Directories]
BinDir=.\Bin\
CDir=.\Include\
CppDir=.\Include\G++;.\Include\
LibDir=.\Lib\
VB6 Portable:
Код: Выделить всё
start ."\Programming\Visual Basic 6\Portable.VB6\vb6.exe"
Добавлено: 11.03.2008, 16:08
N_T
NetSkipper писал(а):Вот такая конфигурация у меня сработала: (то есть по одной точке)
А ты попробуй без точки и следующего за ней бэк-слэша. Тоже должно сработать. Ведь точка - это ссылка на текущую папку. Зачем же её писать, если ты и так в ней?
А если не нужно задавать "рабочую папку", то можно обойтись и без start
Добавлено: 11.03.2008, 20:10
danygug
Вашему Внивманию предлагается маленькая удобная утилика которая не требует установки и легка в настройках
и не нужна писать никакей батники. так же нет привязки к букве диска
также при запуске появляеться в трее иконка быстрого запуска
Скрытый текст
Для просмотра скрытого текста необходимо быть авторизованным пользователем.
Добавлено: 11.03.2008, 23:47
NetSkipper
danygug, гдеж ты раньше то был
Сейчас бегу пробовать. Только с рапиды незачем качать, программка и так бесплатная..
http://pegtop.net/start
Добавлено: 12.03.2008, 00:23
BigWig
NetSkipper писал(а):Правда маленькая ошибочка.
Вот такая конфигурация у меня сработала: (то есть по одной точке)
Для примера, который я привел, когда исполняемый файл находится в директории Bin обязательно надо использовать две точки.
N_T писал(а):А ты попробуй без точки и следующего за ней бэк-слэша. Тоже должно сработать. Ведь точка - это ссылка на текущую папку. Зачем же её писать, если ты и так в ней?
С точкой это скорее всего юниксоидная форма записи. В данном случае будет работать и таки так, но с точкой более понятно, особенно если ссылаются на файл в текущей директории, сравни Foo.exe и .\Foo.exe.
N_T писал(а):А если не нужно задавать "рабочую папку", то можно обойтись и без start
В данном случае надо указывать рабочую папку, для того чтобы использовать относительные пути в конфиг. файле.
Добавлено: 12.03.2008, 00:26
NetSkipper
BigWig писал(а):Для примера, который я привел, когда исполняемый файл находится в директории Bin обязательно надо использовать две точки.
Этот момент я не понял. В твоём примере, там Bin где ты написал одну точку а в остальныx по две.
Код: Выделить всё
[Directories]
BinDir=.\
CDir=..\Include\
CppDir=..\Include\G++;..\Include\
LibDir=..\Lib\
Добавлено: 12.03.2008, 00:35
danygug
NetSkipper писал(а):Только с рапиды незачем качать, программка и так бесплатная..
ты прав, просто небыло времени найти сайт разработчика и на автамате быстрее получилось с рапидой ... главное, что тебе подошло

Добавлено: 12.03.2008, 01:31
N_T
NetSkipper писал(а):Этот момент я не понял.
Да понять его, надёжа-царь, не мудрено (с) дьяк Феофан
Тут не надо ничего усложнять - всё гораздо проще. В ДОС "." означает ссылку на текущую папку, ".." - ссылку на вышележащую папку. (В unix чуть по другому: "./" - текущая, "../" - вышележащая)
В этом легко убедиться:
(по умолчанию текущая папка для юзера в винде - его профиль)
В строке run набираешь:
. - попадаешь в свой профиль
.. - попадаешь на уровень выше(Documents and Settings)
..\.. - ещё на 1 уровень выше - в корень бутового диска.
В примере
BigWig:
BinDir=.\ -переменной BinDir присваевается значение "текущая папка"
CDir=..\Include\ - переменной CDir присваевается значение "папка Include, расположенная не внутри, а по соседству с текущей" (т.е. подняться на 1 уровень вверх от текущей папки и зайти в папку Include)
И т.д...
Теперь рассмотри свою структуру папок и пропиши к ним пути относительно текущей папки уже со знанием дела.

Добавлено: 12.03.2008, 02:24
NetSkipper
N_T, всё отлично понятно!!! Жаль не могу ещё раз репу поднять.
Значит я правильно всё сделал:
Если у меня стартовая директория: Dev-C++\ и всё папки в ней, значит мне никуда "подниматься" не надо.
Код: Выделить всё
BinDir=.\Bin\
CDir=.\Include\
CppDir=.\Include\G++;.\Include\
LibDir=.\Lib\
Так что
BigWig извиняюсь.
Кстати скачал программу которую предложил
danygug (за что ему ещё раз огромное спасибо, программа просто незаменима) теперь отпала нужда в батникаx, и наверняка программа держит путь, потому что то что я написал в .ini файле держится отлично и программа наxодит свои папки

Добавлено: 16.03.2008, 15:28
NetSkipper
HELP
Оказывается я плоxо проверил. Но Dev-C++ не работает. Не наxодит он папки Bin, Inlcude и т.п.
Может быть просто есть программа которая позволяет делать букву драйва постоянной на любом компьютере и всего?
igor7, может и ты что-то скажешь по этому поводу?
Добавлено: 16.03.2008, 17:41
igor7
NetSkipper
Честно говоря не углублялся особенно в тему... Сейчас перечитал,- ничего лучшего у меня пока нет.
А вот по поводу:
Может быть просто есть программа которая позволяет делать букву драйва постоянной на любом компьютере и всего?
Это можно проверить, но опять таки, если данная буква (скажем Z) будет на каком-нибудь компе занята, то фокус не пройдет.
Добавлено спустя 33 минуты 30 секунд:
Вот нарыл програмку,- USBDLM. Похоже она умеет делать то, что тене нужно:
USBDLM is a Windows service that gives control over Window's drive letter assingment for USB drives. Running as service makes it independent of the logged on user's privileges, so there is no need to give the users the previlege to change drive letters.
It automatically solves conficts between USB drives and network or subst drives of the currently logged on user.
Furthermore you can define new default letters for USB drives and much more.
USBDLM can for newly attached USB drives
- check if the letter is used by a network share of the currently logged on user and assign the next letter that is really available
reserve letters, so they are not used for local drives
assign a letter from a list of new default letters, also dependend on many different criteria as the active user, drive type, connection (USB, FireWire), USB port, volume label, size and others
assign letters for a specific USB drive by putting an INI file on the drive
remove the drive letters of card readers until a card is inserted
show a balloon tip with the assigned drive letter(s)
define autorun events depending on many different criteria
Смотреть и качать
здесь
Добавлено: 16.03.2008, 18:26
NetSkipper
igor7, я именно на неё и наткнулся сегодня. Но во первыx она платная
(xотя думаю лекарство есть), во вторыx на сколько я понял её надо устанавливать на компьютер а не на саму флешку, а этот вариант не подxодит. Ведь не устанавливать её на каждый комп за который я сажусь.
igor7 писал(а):но опять таки, если данная буква (скажем Z) будет на каком-нибудь компе занята, то фокус не пройдет
В основном мне надо это на учебе, а там на всеx компьютераx буквы Z например нет.
Добавлено: 16.03.2008, 18:32
igor7
NetSkipper
Проблема в том, что букву всегда назначает ОС, и я, честно говоря, затрудняюсь найти способ как это обойти...
А чем тебя не устроила програмка, которую тебе danygug предложил?
Добавлено: 16.03.2008, 18:47
NetSkipper
Нашим программерам:
Нашел какой-то кусок кода:
Converting network drive-based path to universal path name
Гляньте пожалуйста! [-o<
igor7 писал(а):А чем тебя не устроила програмка, которую тебе danygug предложил?
Я ей пользуюсь, она отличная замена
поганому (imo) U3 но есть ini файлик которому нужны пути папок..
Код: Выделить всё
[Directories]
BinDir=X:\Dev-C++\Bin\
CDir=X:\Dev-C++\Include\
CppDir=X:\Dev-C++\Include\G++;X:\Dev-C++\Include\
LibDir=X:\Dev-C++\Lib\
В этом вся беда. Остальные программы работаютр на ура в какую директорию я бы не кинул..
NetSkipper писал(а):
Портативная Опера ... там уже есть какой-то .exe файл который проделывает именно это. То есть берет букву драйва и изменяет настройки в Опере.

Вот если б знать как они это сделали..
У портативного Total Commander тоже есть свои фишки..
Код: Выделить всё
TabDir=%COMMANDER_PATH%
pluginbasedir=%COMMANDER_PATH%\Plugins
Я даже пытался поиграться с коммандой
label, ничего не вышло..
Добавлено: 16.03.2008, 22:21
N_T
NetSkipper писал(а):Нашел какой-то кусок кода:
Это всё не из той оперы...
NetSkipper писал(а):Я даже пытался поиграться с коммандой label, ничего не вышло
А это тем более...
NetSkipper писал(а):Вот если б знать как они это сделали..
А нафик? Мы чё, своего создать не можем?
NetSkipper, я ж так понял, что ты программер? Ну так создавай этот ини-файл каждый раз при запуске с нужными строками. Хочешь наваяй чё-нить на Си/Васике. Хочешь простоты - припиши к первому моему скрипту че-нить типа:
Код: Выделить всё
echo [Directories] > cpp.ini (или как там этот файл называется, забыл)
echo BinDir=%flash%\Dev-C++\Bin\ >> cpp.ini
echo CDir=%flash%\Dev-C++\Include\ >> cpp.ini
echo CppDir=%flash%\Dev-C++\Include\G++;X:\Dev-C++\Include\ >> cpp.ini
echo LibDir=%flash%\Dev-C++\Lib\ >> cpp.ini
и т.д.и т.п...
А потом подымай свой СРР.
PS обрати внимание в первой строке >, в остальных >>. Возможно перед именем ини-файла надо будет указать путь к нему с использованием той же переменной %flash%
Добавлено: 16.03.2008, 22:39
NetSkipper
N_T писал(а):я ж так понял, что ты программер?
Никакой я пока не программер, мне ещё очень далеко, только первый год..
Но спасибо ещё раз, попробую, отпишусь..
N_T, прописал как ты сказал, но в итоге, батник уничтожил всё что было в ini файле и оставил только это..
Код: Выделить всё
[Directories]
BinDir=i:\Programming\Dev-C++\Bin\
CDir=i:\Programming\Dev-C++\Include\
CppDir=i:\Programming\Dev-C++\Include\G++;i:\Programming\Dev-C++\Include\
LibDir=i:\Programming\Dev-C++\Lib\
Там ведь по мимо этого ещё куча настроек..
Вот что я прописал в так называемый autoexec.bat
Код: Выделить всё
@Echo off
For %%a In (c d e f g h i j k l m n o p q r s t u v w x y z) Do If Exist %%a:\drv.ltr Set flash=%%a:
Echo USB Drive %flash%
echo [Directories] > %flash%\Programming\Dev-C++\devcpp.ini
echo BinDir=%flash%\Programming\Dev-C++\Bin\ >> %flash%\Programming\Dev-C++\devcpp.ini
echo CDir=%flash%\Programming\Dev-C++\Include\ >> %flash%\Programming\Dev-C++\devcpp.ini
echo CppDir=%flash%\Programming\Dev-C++\Include\G++;%flash%\Programming\Dev-C++\Include\ >> %flash%\Programming\Dev-C++\devcpp.ini
echo LibDir=%flash%\Programming\Dev-C++\Lib\ >> %flash%\Programming\Dev-C++\devcpp.ini
Добавлено: 17.03.2008, 01:45
N_T
NetSkipper писал(а):в итоге, батник уничтожил всё что было в ini файле и оставил только это..
Ну дык само собой... Жаль, что ты не обратил внимания на фразу:
N_T писал(а):и т.д.и т.п...
Т.е. надо было таким же образом поступить со всеми остальными строчками ини-файла.
Но если он большой, и в последующих строках нет необходимости привязываться к букве, то можешь в конце скрипта воспользоваться командой копи:
, devcpp.ini - файл, созданный скриптом, а template.ini - та часть файла первоначального devcpp.ini, которая не нуждается в модификации (т.е. вырежи неизменяемую часть из "родного" devcpp.ini и запиши её под именем template.ini ).
PS Строчку
Echo USB Drive %flash%
из скрипта убери. Она служит лишь для демонстрации работоспособности
PPS Если тебя интересует способ "промышленного" создания "portable" приложений, то поищи в инете Thinstall Virtualization Suite. Стоит, правда, она около 5 килобаксов, но можно найти лекарство...