Как сохранить файловую ассоциацию при вызове программы из командного файла? - PullRequest
0 голосов
/ 29 апреля 2018

Есть ли способ сохранить исходную ассоциацию файлов при запуске программы из командного файла?

Я создал командный файл, который вызывает программу Windows и выполняет некоторые операции с файлами. Я изменил ассоциацию файлов на командный файл. Когда я щелкаю по файлу, связанному с этой программой, пакетный файл запускается и открывает программу, но файл, по которому я щелкаю, не загружается. Исходная файловая ассоциация потеряна.

Эта сортировка имеет смысл, потому что команда CALL в пакетном файле однажды удаляется из первоначального щелчка мышью, инициировавшего пакетный файл.

Можно ли добавить синтаксис, который передаст имя целевого файла в пакетный файл как переменную и добавит его в командную строку CALL?

Кстати, это для машины XP. Любая помощь будет оценена!

РЕДАКТИРОВАТЬ: вот код, который я пытаюсь написать:

call "C:\Program Files\CorelDRAW X4\Programs\CorelDRW.exe"
:loop
if exist "C:\Documents and Settings\<user>\My Documents\corel user files\*.cdr" copy "C:\Documents and Settings\<user>\My Documents\corel user files\*.cdr" "C:\Documents and Settings\<user>\My Documents\corel user files\*.sav"
ping localhost -n 300 > nul
goto loop

Я пытаюсь защитить файл автосохранения CorelDraw. Существует ошибка, из-за которой CorelDraw иногда удаляет файл автосохранения во время аварийного завершения работы. Я изменил ассоциацию файлов .cdr, чтобы щелчок по файлу cdr вызывал пакетный файл, который, в свою очередь, вызывает Coreldraw и копирует файл автосохранения с другим именем файла. Эта часть работает, но я должен вручную открыть файл, на котором щелкнул.

В идеале я хотел бы найти способ завершить цикл при закрытии CorelDraw, но я перейду этот мост, как только решу проблему ассоциации файлов.

EDIT2: Вот результат эха %CMDCMDLINE%:

C:\WINDOWS\system32\cmd.exe /c ""C:\Documents and Settings\<user>\My Documents\corel user files\protect_autosave.bat"  "C:\Documents and Settings\<user>\My Documents\filename.cdr""

1 Ответ

0 голосов
/ 30 апреля 2018

Насколько я понял требования к задаче, код для использования в командном файле %ProgramFiles%\CorelDRAW X4\Programs\CorelFile.bat:

@echo off
if "%~1" == "" goto :EOF
"%ProgramFiles%\CorelDRAW X4\Programs\CorelDRW.exe" %*
for %%I in (%*) do if exist %%I copy /Y "%%~I" "%%~dpnI.sav" >nul

Этот пакетный файл должен быть связан с расширением файла .cdr, например, путем импорта следующего файла реестра в Windows XP и более поздних версиях Windows с правами администратора:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.cdr]
@="CorelDrawFile"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile]
@="Corel Draw Image"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile\DefaultIcon]
@=hex(2):22,25,50,72,6f,67,72,61,6d,46,69,6c,65,73,25,5c,43,6f,72,65,6c,44,52,\
  41,57,20,58,34,5c,50,72,6f,67,72,61,6d,73,5c,43,6f,72,65,6c,44,52,57,2e,65,\
  78,65,22,2c,30,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile\shell\open\command]
@=hex(2):22,25,50,72,6f,67,72,61,6d,46,69,6c,65,73,25,5c,43,6f,72,65,6c,44,52,\
  41,57,20,58,34,5c,50,72,6f,67,72,61,6d,73,5c,43,6f,72,65,6c,46,69,6c,65,2e,\
  62,61,74,22,20,22,25,31,22,00

Также возможно зарегистрировать расширение файла .cdr с абсолютными путями с REG_SZ вместо использования REG_EXPAND_SZ и %ProgramFiles% в путях.

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.cdr]
@="CorelDrawFile"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile]
@="Corel Draw Image"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile\DefaultIcon]
@="\"C:\\Program Files\\CorelDRAW X4\\Programs\\CorelDRW.exe\",0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CorelDrawFile\shell\open\command]
@="\"C:\\Program Files\\CorelDRAW X4\\Programs\\CorelFile.bat\" \"%1\""

Проводник Windows вызывает для каждого выбранного * .cdr файла пакетный файл, используя контекстное меню Открыть соответственно при двойном щелчке по одному * .cdr файлу.

Пакетный файл запускается Corel Draw , причем все аргументы, передаваемые пакетному файлу, передаются в Corel Draw . Обычно это просто имя файла * .cdr с полным путем и расширением файла, заключенными в двойные кавычки.

После завершения Corel Draw пакетный файл проверяет наличие каждого файла, указанного в качестве аргумента командной строки, и копирует файл с тем же именем в тот же каталог с другим расширением файла .sav.

Пакетный файл предназначен для запуска с несколькими именами файлов * .cdr, указанными в качестве аргументов в командной строке. Я не знаю, поддерживает ли Corel Draw несколько файлов * .cdr, указанных в командной строке.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... объясняет %* (пакетный файл) и %1 (реестр Windows).
  • copy /?
  • echo /?
  • for /?
  • if /?
...