CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Ответить
Аватара пользователя
VirusFUN

CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение VirusFUN »

Не знал как еще сформулировать заголовок, но задача такая:

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

Далее скрипт открывает заранее заданный в нем текстовый файл (например C:\setups.txt) , УДАЛЯЕТ заданное кол-во строк от конца (т.е. не первые строки, а последние, скажем, 4 строки), а затем прописывает следующие строки:

"какая-то команда, ПУТЬ К ПАПКЕ

какая-то команда, ИМЯ ФАЙЛА"



например:

cd E:\INSTALL

del setup.exe



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



Заранее спасибо.
Аватара пользователя
VirusFUN

Re: CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение VirusFUN »

Может быть кому-то будет интересным:

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



Я придумал следующее:

монтируем папку с прогой как диск С. Например: mount C C:\MegaCad\ (здесь лежит исполняемый файл проги: megac.exe)

монтируем папку с файлом как див D. Например: mount D C:\Проекты\Cool\Бабруйск\Project1\ (здесь лежит файл проекта, например: project.mcp)

Переходим в диск D:\

запускаем прогу и в конце прописываем имя открываемого файла! Пример: C:\megac.exe project.mcp



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



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

Re: CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение megaloman »

Цитата:



нажимаем ХотКей, что запустит скрипт, который скопирует полный путь к папке где лежит этот файл, например: 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

Re: CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение gora »

Цитата VirusFUN:



или контекстное меню...
CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.




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



Код:

Код: Выделить всё

:: Кодировка кириллица 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 строки), а затем прописывает следующие строки:

"какая-то команда, ПУТЬ К ПАПКЕ

какая-то команда, ИМЯ ФАЙЛА"

CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.




Сам батник 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

Re: CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение VirusFUN »

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



gora, скажи, зачем нужно это в твоем примере?: Del /Q "%file%"

Да и вообще, зачем нужен темп-файл?



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

Echo cd "%~dp1"

Echo del "%~nx1"

Вместо того, чтобы заменить ими только последние 2 строки.



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

Re: CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.

Сообщение gora »

Цитата VirusFUN:



Опечатка?
CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.




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



зачем нужен темп-файл?
CMD/BAT - Скопировать путь к открытому файлу и прописать его в конце текстового файла.




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

Код:

Код: Выделить всё

@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%"
Ответить

Вернуться в «Скриптовые языки администрирования Windows»