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

anoxina 06-12-2015 19:40 2582100

Вывести сведения о зарегистрированных действиях для заданного расширения файла
 
Вывести сведения о зарегистрированных действиях для заданного расширения файла и программах, выполняющих эти действия. Нельзя использовать assoc.

Примеры запуска:
> accocx.cmd /?
> accocx.cmd txt
> accocx.cmd .txt
open: C:\WINDOWS\system32\NOTEPAD.EXE %1
print: C:\WINDOWS\system32\NOTEPAD.EXE /p %1
printto: C:\WINDOWS\system32\notepad.exe /pt "%1" "%2" "%3" "%4"

Foreigner 06-12-2015 20:02 2582106

Цитата:

Цитата anoxina
Нельзя использовать assoc »

Почему?

anoxina 06-12-2015 20:08 2582110

Такие условия задачи... По сути нужно сделать программу которая работает вместо команды assoc

Foreigner 06-12-2015 20:11 2582113

Понятно:
Код:

reg /?
for /?
set /?
if /?


greg zakharov 07-12-2015 09:56 2582287

Код:

@echo off
  setlocal
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if "%i%" equ "1" if "%i%" equ "/?" goto:man
    if "%i%" neq "1" goto:man
   
    set "ext=%1"
    if "%ext:~0,1%" neq "." set "ext=.%ext%"
    for /f "skip=3 tokens=2,*" %%i in (
      '2^>nul reg query "HKCR\%ext%" /ve'
    ) do (
      for /f "tokens=4 delims=\" %%k in (
        'reg query "HKCR\%%j\shell"'
      ) do (
        for /f "skip=3 tokens=2,*" %%l in (
          'reg query "HKCR\%%j\shell\%%k\command" /ve'
        ) do echo:%%k: %%m
      )
    )
  endlocal
exit /b

:man
  for %%i in (
    "Usage: %~n0 <extension>"
    ""
    ".e.g.: C:\>%~n0 txt"
    ".e.g.: C:\>%~n0 .txt"
    "Output:"
    "  open: %%SystemRoot%%\system32\NOTEPAD.EXE %%1"
    "  print: %%SystemRoot%%\system32\NOTEPAD.EXE /p %%1"
    "  printto: %%SystemRoot%%\system32\notepad.exe /pt "%%1" "%%2" "%%3" "%%4""
  ) do echo:%%~i
exit /b


Foreigner 07-12-2015 11:07 2582305

greg zakharov, Какая виндовс? У меня что-то ваш вариант не работает.
Код:

@echo off
setlocal

if "%1"=="/?" goto:help
if "%1"=="" goto:help

1>nul chcp 65001

for /f "tokens=*" %%i in ('reg query hkcr\%1 /ve') do for %%j in (%%i) do set "assoc=%%j"

:: ftype %assoc%

for %%i in (open print printto) do (

    for /f "tokens=2*" %%j in ('reg query hkcr\%assoc%\shell\%%i\command ^| findstr "REG_"') do (

        echo %%i: %%k

))

1>nul chcp 866
goto:eof

:help
echo Usage: %~n0 [.ext^|/?]


anoxina 07-12-2015 12:48 2582338

Foreigner, Большое спасибо, не расскажите как это работает?
И еще проблема в том, например пишешь "> accocx.cmd txt" ничего не работает, а выдает ошибку, не знаете как это исправить?
Буду очень благодарна Вам))

Foreigner 07-12-2015 13:20 2582345

anoxina, Расширение принято обозначать с точкой. Исправьте верх батника (и кодировку 437, т.к. utf-8 не везде работает)
Код:

@echo off
setlocal

if "%1"=="/?" goto:help
if "%1"=="" goto:help
set "ext=.%1"

1>nul chcp 437

for /f "tokens=*" %%i in ('reg query hkcr\%ext:..=.% /ve').....

строку -- :: ftype %assoc% можно убрать, я просто смотрел вывод
Цитата:

Цитата anoxina
не расскажите как это работает? »

Нет времени, если коротко, то сначала получаем значение ассоциации расширения, а потом с помощью него находим соответствующие команды на открытие и печать. Все эти данные находятся в ресстре, в HKCR, кодовую страницу (chcp 437) меняем, для удобства обработки строк.

anoxina 13-12-2015 19:18 2584455

Цитата:

Цитата Foreigner
for /f "tokens=*" %%i in ('reg query hkcr\%ext:..=.% /ve') »

Объясните что делает вот эта строчка

Цитата:

Цитата Foreigner
for /f "tokens=*" %%i in ('reg query hkcr\%1 /ve') do for %%j in (%%i) do set "assoc=%%j" »

Точнее что она полностью делает

Foreigner 13-12-2015 19:48 2584472

Код:

for /f "tokens=*" %%i in ('reg query hkcr\%1 /ve') do for %%j in (%%i) do set "assoc=%%j"
В первом цикле for берет из реестра с помощью штатной утилиты reg.exe значение HKCR\.расширение по умолчанию (ключ /ve), во втором for обрабатывает полученную строку (забирает из нее последний токен) и присваивает его переменной assoc. Например в консоли:



После первого цикла выделена строка, которую обрабатываем во втором цикле, что бы получить значение ассоциации для .txt. Если оба цикла совместить, то получим нужную информацию:


anoxina 17-12-2015 20:34 2585870

Выявилась следующая проблема, при вводе, например, расширения .java выводятся не все команды данного расширения, т. е. выводит "open:", а дальше error, но нужно чтобы выводились все команды
И в случае когда выдает ошибки в For Нужно их скрывать

Foreigner 17-12-2015 21:43 2585895

Цитата:

Цитата anoxina
но нужно чтобы выводились все команды »

Значит этих параметров ключей реестра просто нет. Проверьте переменную %assoc%, для этого используйте if и операторы сравнения. Для подавления ошибок reg.exe перенаправляйте STDERR в NUL.

anoxina 18-12-2015 08:31 2586031

Но в .java есть другие параметры и они все тоже должны выводиться на консоль

anoxina 21-12-2015 14:54 2587050

Исправлено.


Время: 13:13.

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