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

VirusFUN 07-09-2012 07:46 1984556

Скопировать путь к открытому файлу и прописать его в конце текстового файла.
 
Не знал как еще сформулировать заголовок, но задача такая:
Нужно скопировать путь к папке, где лежит указанный файл. (Например, заходим на флешку в папку INSTALL, а в этой папке выделяем файл и нажимаем ХотКей, что запустит скрипт, который скопирует полный путь к папке где лежит этот файл, например: G:\INSTALL\. Но и имя файла тоже... Можно использовать переменные? Одна - путь к папке, а другая - имя файла?)
Далее скрипт открывает заранее заданный в нем текстовый файл (например C:\setups.txt) , УДАЛЯЕТ заданное кол-во строк от конца (т.е. не первые строки, а последние, скажем, 4 строки), а затем прописывает следующие строки:
"какая-то команда, ПУТЬ К ПАПКЕ
какая-то команда, ИМЯ ФАЙЛА"

например:
cd E:\INSTALL
del setup.exe

Возможно ли такое в батниках или шелл-скриптах? Я просто не знаю как реализована работа с переменными в батниках и как ему узнать путь к файлу или папке, если он в этой папке не лежит (постоянно копировать его из папки в папку - не вариант). В идеале, конечно, чтобы было как я и описал, т.е. через горячую клавишу или контекстное меню... но жду ваших предложений, чтобы хоть как-то выйти из положения.

Заранее спасибо.

VirusFUN 07-09-2012 08:11 1984562

Может быть кому-то будет интересным:
В моей компании люди работают в старой проге, которой не существует аналогов и которая существует только под ДОС, но успешно работает во всех виндах до Висты... но у нас лицензии только на семерку! Проблема существует только с этой прогой. Я нашел решение в виде DOSBOX'а, прога запускает просто идеально (правда приходилось несколько раз переконфигить досбокс, подбирая видео-режимы и типы процессоров). Но, народ жалуется, что пропала возможность запускать файлы, созданные этим ПО, непосредственно из папок, где они лежат! Т.е. приходится копировать их в папку, которая монтируется как диск C:, а потом в самой проге их открывать... это и неудобно и долго.

Я придумал следующее:
монтируем папку с прогой как диск С. Например: mount C C:\MegaCad\ (здесь лежит исполняемый файл проги: megac.exe)
монтируем папку с файлом как див D. Например: mount D C:\Проекты\Cool\Бабруйск\Project1\ (здесь лежит файл проекта, например: project.mcp)
Переходим в диск D:\
запускаем прогу и в конце прописываем имя открываемого файла! Пример: C:\megac.exe project.mcp

Всё это прописывается в файл конфига досбокса, в самом конце! Затем запускается досбокс и выполняет все эти команды... Таким образом, прога запускается и открывает заданный файл, а конечный пользователь практически не замечает того, что работает в эмуляторе!

(Другие варианты не предлагать! Я ТОЧНО знаю, что это работает так и никак иначе, т.к. вопрос изучен досконально. Не стоит говорить, например, нафига переходить в диск D:, или почему бы не прописывать полный путь до нужного файла и т.п. Испробовано всё! Прога слушается только так.)

megaloman 07-09-2012 11:00 1984632

Цитата:

нажимаем ХотКей, что запустит скрипт, который скопирует полный путь к папке где лежит этот файл, например: G:\INSTALL\. Но и имя файла тоже... Можно использовать переменные? Одна - путь к папке, а другая - имя файла?)
Код:

@Echo Off
cls

rem Присваиваем переменным пути файла  с батником

Set DPName=%0
Set DName=%~d0
Set PName=%~p0
Set DP=%~dp0
Set Name=%~nx0

rem Выдаём на экран значения переменных

Echo Полный путь к скрипту        %DPName%
Echo Диск к скрипту              %DName%
Echo Путь к скрипту              %PName%
Echo Диск и путь к скрипту        %DP%
Echo Имя скрипта и его расширение %Name%

Читаем подсказку For /?
Цитата:

как ему узнать путь к файлу или папке, если он в этой папке не лежит
- но есть же какой-то алгоритм, по которому Вы находите эту информацию. Имена папок, имена файлов? На чём основывается Ваш поиск?
Цитата:

Далее скрипт открывает заранее заданный в нем текстовый файл (например C:\setups.txt) , УДАЛЯЕТ заданное кол-во строк от конца (т.е. не первые строки, а последние, скажем, 4 строки), а затем прописывает следующие строки:
Не проще ли иметь файл, условно, setups.000, который берём как бланк, копируем его в setups.txt и ДОПИСЫВАЕМ в него строки? Например
Код:

Copy C:\Setups.000 C:\Setups.txt
Echo cd /D E:\INSTALL>>C:\Setups.txt
Echo If %Errorlevel%==0 del setup.exe>>C:\Setups.txt


gora 07-09-2012 11:50 1984667

Цитата:

Цитата VirusFUN
или контекстное меню... »

Батник для добавления пункта Путь к файлу в контекстное меню
Код:

:: Кодировка кириллица DOS (866)
Set Key=HKCU\Software\Classes\*\shell\Путь к файлу
:: Путь к батнику
Set PathScript=e:\Temp\test 1.bat
Reg Add "%Key%" /f
Reg Add "%Key%\command" /ve /t REG_SZ /d "\"%PathScript%\" \"%%1\"" /f

Цитата:

Цитата VirusFUN
запустит скрипт, который скопирует ... путь к папке, ... имя файла
УДАЛЯЕТ заданное кол-во строк от конца (т.е. не первые строки, а последние, скажем, 4 строки), а затем прописывает следующие строки:
"какая-то команда, ПУТЬ К ПАПКЕ
какая-то команда, ИМЯ ФАЙЛА"
»

Сам батник test 1.bat
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Путь к файлу setups.txt
Set file=e:\Temp\setups.txt
:: Путь к временному файлу
Set tmpfile=e:\Temp\setups.tmp

For /F "usebackq tokens=* delims=" %%i In ("%file%") Do Set /A cnt += 1
Set /A cnt -= 4
(For /F "usebackq tokens=* delims=" %%i In ("%file%") Do (
        Echo %%i
        Set /A cnt -= 1
        If "!cnt!" LEQ "0" GoTo _marc
))>
"%tmpfile%"
:_marc
(
Echo cd "%~dp1"
Echo del "%~nx1")>>"%tmpfile%"
Copy /Y "%tmpfile%" "%file%"
Del /Q "%tmpfile%"

Пустые строки в setups.txt не считаются и в конечный результирующий файл setups.txt не попадают

VirusFUN 10-09-2012 06:13 1985927

Всем огромное спасибо, свою идею реализовал так как хотелось! Но, у меня остались маленькие вопросы:

gora, скажи, зачем нужно это в твоем примере?: Del /Q "%file%"
Да и вообще, зачем нужен темп-файл?

Сначала я сделал всё так, как ты написал... Но, если удалять какой-то из файлов - то при следующей манипуляции (следующем запуске "test 1.bat") , существующий файл "setups.tmp" будет полностью перезаписан и будет содержать только эти строки:
Echo cd "%~dp1"
Echo del "%~nx1"
Вместо того, чтобы заменить ими только последние 2 строки.

Я закомментил удаление файла и всё работает как надо! К тому же.. я не пойму твою логику, ведь удаляться должен темп-файл, а у тебя наоборот. Опечатка?

gora 10-09-2012 08:08 1985960

Цитата:

Цитата VirusFUN
Опечатка? »

Да, исправил.
Цитата:

Цитата VirusFUN
зачем нужен темп-файл? »

Вариант без временного файла:
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Путь к файлу setups.txt
Set file=e:\Temp\setups.txt

For /F "usebackq tokens=* delims=" %%i In ("%file%") Do Set /A cnt += 1& Set $!cnt!=%%i
Set /A cnt -= 4
(For /L %%i In (1,1,%cnt%) Do Echo !$%%i!
Echo cd "%~dp1"
Echo del "%~nx1")>"%file%"



Время: 19:06.

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