Windows: запустить файл, используя (не по умолчанию) глагол оболочки, например "edit" из.bat или из командной строки

Как я могу запустить файл с помощью связанной команды по умолчанию (глагол оболочки), такой как "edit", "print", ... из командной строки или из сценария.bat, используя стандартные средства Windows.
(Те дополнительные действия, которые вы получаете, предлагаются при щелчке правой кнопкой мыши по файлу в проводнике Windows.)

Таким образом, получая эффект

python -c "import os;os.startfile('somepic.png', 'edit')"

(ShellExecuteEx), но без использования дополнительных инструментов, таких как python, powershell или около того. Команда START, похоже, этого не предлагает.

4 ответа

Как выяснилось из комментариев и после дальнейшего поиска: в стандартной Windows, похоже, нет прямой команды для этой задачи.
Однако использование фрагмента VBScript должно быть высоко совместимым и иметь минимальные системные требования. (Работает на всех машинах здесь напрямую - из XP - в отличие от JScript)

VBScript был установлен по умолчанию в каждом выпуске Microsoft Windows для настольных компьютеров, начиная с Windows 98; 1 в Windows Server, начиная с Windows NT 4.0 Option Pack;[2] и дополнительно с Windows CE (в зависимости от устройства, на котором он установлен).

Пример скрипта shellexec.vbs:

' shellexec.vbs : starts a file using a (non-default) shell verb like "EDIT"
' Usage: shellexec.vbs FILE VERB
' Example: shellexec.vbs demo.png EDIT
fn = WScript.Arguments(0)
cmd = WScript.Arguments(1)
Wscript.Echo "ShellExecute """ + cmd + """ on " + fn
CreateObject("shell.application").ShellExecute fn, "", "", cmd, 1

Использовать из командной строки или пакетного файла:

shellexec.vbs demo.png EDIT

или же:

cscript.exe //Nologo shellexec.vbs demo.png EDIT

Пример, чтобы показать, как это сделать с помощью одной строки:

mshta vbscript:Execute("CreateObject(""shell.application"").ShellExecute""%SystemDrive%\autoexec.bat"","""","""",""edit"",1:close")

Это откроет манекен autoexec.bat файл с приложением, определенным для редактирования .bat файлы (по умолчанию Блокнот).

С помощью пакетного кода можно выполнить команду START для действия по умолчанию открытия файла со связанным приложением.

В комментируемом коде партии ниже глагол оболочки должен быть указан в третьей строке, присваиваемой переменной среды ActionCommand,

Имя файла для edit, printto,... должен быть указан в качестве первого параметра командного файла.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "ActionCommand=edit"

rem Check if batch file was started with name of an existing file.

if "%~1" == ""      set "ErrMsg=No file name specified as argument on starting %~nx0" & goto OutputError
if exist "%~1\"     set "ErrMsg="%~f1" is a directory and not a file" & goto OutputError
if not exist "%~f1" set "ErrMsg=A file "%~f1" does not exist" & goto OutputError

rem Check if specified file has a file extension. Files starting with . and
rem not containing at least a second . are also files with no file extension.

if "%~n1" == "" set "ErrMsg=File "%~f1" has no file extension" & goto OutputError
if "%~x1" == "" set "ErrMsg=File "%~f1" has no file extension" & goto OutputError


rem On Windows Vista and later REG.EXE outputs without version info for example:

rem HKEY_CLASSES_ROOT\.txt
rem    (Default)    REG_SZ    txtfile

rem There are only spaces used to separate value name, value type and value string.

rem But REG.EXE version 3.0 outputs on Windows XP with version info for example:

rem ! REG.EXE VERSION 3.0
rem
rem HKEY_CLASSES_ROOT\.txt
rem     <NO NAME>   REG_SZ  txtfile

rem NOTE: There are 4 indent spaces and 2 separating tabs in REG 3.0 output line.

rem So either token 2 or token 3 contains value type REG_SZ
rem used to identify the line with the wanted information.
set "TypeToken=2"

rem Get name of registry key associated with extension of specified file.

:GetAssociatedKey
for /F "skip=1 tokens=%TypeToken%*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCR\%~x1" /ve 2^>nul') do (
    if "%%A" == "REG_SZ" set "KeyName=%%B" & goto GetCommand
    if "%%A" == "NAME>" set "TypeToken=3" & goto GetAssociatedKey
)
set "ErrMsg=No file assocation found for %~x1 in registry" & goto OutputError

:GetCommand
for /F "skip=1 tokens=%TypeToken%*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCR\!KeyName!\shell\%ActionCommand%\command" /ve 2^>nul') do (
    if "%%A" == "REG_SZ"        set "ActionCommand=%%B" & goto PrepareCommand
    if "%%A" == "REG_EXPAND_SZ" set "ActionCommand=%%B" & goto PrepareCommand
)
set "ErrMsg=No edit command found for %~x1 in registry" & goto OutputError

rem Replace "%1" or %1 by full name of specified file in double quotes or
rem append a space and full name of specified file if the command string
rem does not contain "%1" or %1 at all. Then expand the command string.

:PrepareCommand
set "ActionCommand=!ActionCommand:"%%1"="%~f1"!"
set "ActionCommand=!ActionCommand:%%1="%~f1"!"
if "!ActionCommand:%~f1=!" == "!ActionCommand!" set "ActionCommand=!ActionCommand! "%~f1""
call set "ActionCommand=%ActionCommand%"

rem Run the command with current directory set for the application to folder
rem of specified file without checking if the executable file exists at all.
rem Command start displays an error message box which must be confirmed by
rem the user by a click on button OK and outputs the error message also to
rem console if the executable to start could not be found.

start "" /D"%~dp1" %ActionCommand%

endlocal
goto :EOF


:OutputError
echo %~f0
echo.
echo Error: !ErrMsg!.
echo.
echo Press any key to exit batch processing ...
endlocal
pause >nul

Этот пакетный файл может не работать для всех возможных команд действий, но он должен работать для 99,5% всех edit, printto... команды.

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

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg query /?
  • rem /?
  • set /?
  • setlocal /?
  • start /?

Не уверен, что это то, что вы ищете, но с помощью команды START открывается файл, который я хочу отредактировать в программе по умолчанию.

START "" "Mypdf.pdf"
START "" "Myfile.txt"
START "" "Myjpg.jpg"
ETCETERA ETCETERA........
Другие вопросы по тегам