Мгновенная настройка привычных файловых ассоциаций

    Автоматизировал задание файловых ассоциаций, то есть выбор программы которая будет открывать файл из Explorer/Finder. И делюсь.


    Сначала проблематика. Файлы нужных расширений часто не открываются по умолчанию ничем, а если открываются, то каким-нибудь iTunes. Под windows нужные ассоциации, бывает, и вовсе теряются при установке (или даже деинсталяции) программ: снесёшь, бывало, GIMP, а ico-файлы перешли во владение от привычного просмотрщика файлов к стандартной Photo Gallery. Почему? Зачем? Неизвестно… А если нашёл новый редактор или, по разным причинам, свежая инсталляция? А если компьютер не один? В общем, кликать мышками в диалогах — развлечение такое себе.


    Вместо этого я сохранил два файлика на Dropbox и теперь привести компьютерный мир к привычному состоянию можно почти мгновенно. И чего ждал столько лет… Далее рецепт для Windows и macOS.


    Windows


    В консоли Windows cmd.exe это делается в два этапа:


    ftype my_file_txt="C:\Windows\notepad.exe" "%1"
    assoc .txt=my_file_txt

    Изменения вступают в силу сразу. Несмотря на то, что ассоциация прописывается для текущего пользователя, запускать эти команды нужно почему-то с правами администратора. И не забыть задвоить символ процента (%%1) при запуске из bat-файла. Волшебный мир Windows 7 Ultimate 64-bit...


    UPD. Опыты показали, что манипуляции с ftype/assoc воздействуют на всех юзеров на машине (такого поворота наша редакция не ожидала). Тем не менее, схема остаётся рабочей. Но буду выяснять как не затронуть остальных.


    macOS


    В макоси ассоциации удобно задавать утилитой duti. Устанавливается она  через brew install duti. Пример использования:


    duti -s com.apple.TextEdit .txt "editor"

    Изменения вступают в силу сразу, sudo не требуется. Здесь аргумент "com.apple.TextEdit" — это так называемый "bundle id" нужной нам программы. Аргумент "editor" — тип ассоциации: "editor" для редактирования, "viewer" для просмотра, "all" для всего.


    Найти "bundle id" можно так: если есть "/Applications/Sublime Text.app" третьей версии, то бандл айди у неё будет "com.sublimetext.3", ну или какой-то другой:


    > osascript -e 'id of app "Sublime Text"'
    com.sublimetext.3

    Проверено на macOS Sierra.


    Итоговый скрипт для Windows (.bat)


    @echo off
    
    set XNVIEW=C:\Program Files (x86)\XnView\xnview.exe
    set SUBLIME=C:\Program Files\Sublime Text 3\sublime_text.exe
    set FOOBAR=C:\Program Files (x86)\foobar2000\foobar2000.exe
    
    call :assoc_ext "%SUBLIME%" txt md js json css java sh yaml
    call :assoc_ext "%XNVIEW%" png gif jpg jpeg tiff bmp ico
    call :assoc_ext "%FOOBAR%" flac fla ape wav mp3 wma m4a ogg ac3
    
    goto :eof
    
    :assoc_ext
      set EXE=%1
      shift
      :loop
      if "%1" neq "" (
        ftype my_file_%1=%EXE% "%%1"
        assoc .%1=my_file_%1
        shift
        goto :loop
      )
    goto :eof

    Итоговый скрипт для macOS (.sh)


    #!/bin/bash
    
    # this allows us terminate the whole process from within a function
    trap "exit 1" TERM
    export TERM_PID=$$
    
    # check `duti` installed
    command -v duti >/dev/null 2>&1 || \
      { echo >&2 "duti required: brew install duti"; exit 1; }
    
    get_bundle_id() {
        osascript -e "id of app \"${1}\"" || kill -s TERM $TERM_PID;
    }
    
    assoc() {
        bundle_id=$1; shift
        role=$1; shift
        while [ -n "$1" ]; do
            echo "setting file assoc: $bundle_id .$1 $role"
            duti -s "$bundle_id" ".${1}" "$role"
            shift
        done
    }
    
    SUBLIME=$(get_bundle_id "Sublime Text")
    TEXT_EDIT=$(get_bundle_id "TextEdit")
    MPLAYERX=$(get_bundle_id "MPlayerX")
    
    assoc "$SUBLIME" "editor" txt md js jse json reg bat ps1 cfg sh bash yaml
    assoc "$MPLAYERX" "viewer" mkv mp4 avi mov webm
    assoc "$MPLAYERX" "viewer" flac fla ape wav mp3 wma m4a ogg ac3
    • +16
    • 7,3k
    • 9
    Поделиться публикацией

    Комментарии 9

      +2
      В дополнение: в Windows 8 и выше появилась возможность выгрузить ассоциации через dism. Сначала запускаем control /name Microsoft.DefaultPrograms, выставляем там нужные ассоциации под нужные приложения, затем делаем dism /online /Export-DefaultAppAssociations:%filename%. Для импорта — dism /online /Import-DefaultAppAssociations:%filename%
      Разумеется, ПО, которое окажется в файле экспорта. перед импортом необходимо установить, если в системе его нет.
        0
        Это только половина дела. Так экспортируется только то, что делает assoc. А надо бы ещё и пути к exe сохранить/задать
        0
        Непонятно как скрипт запущеный от администратора применяется к текущему пользователю.
        Может все таки ко всем пользователям?
          0
          Возможно не от администратора, а с правами администратора.
          Запустите консоль от админа и поиграйтесь с whoami или (wmic computersystem get username — возможно показывает последнего залогиненного пользователя и не годится для проверки) или echo %username%
            0

            Так точно: "As administrator" имелось ввиду.

              0
              После комментария уровнем выше — проэкспериментировал. Например запустил cmd от имени администратора. При запуске — будет запрос привеллегий и какого админа введете — от того и запустится. Соответсвенно того и покажет whoami и %username%.

              Поэтому на данный момент тНе могут понять как в вашей среде не-администратор может работать с правами администратора.

              А вы сами проверяли?
          –2
          Разве винда сама не спрашивает с помощью чего надо открыть не ассоциированный файл?

          А если хотите изменить ассоциацию есть несколько способов сделать это через ГУИ.

          Способ 1:
          Shift + клик правой кнопкой мыши
          Пункт «Открыть с помощью ...»
          Выбрать программу
          Галочку «Всегда использовать эту программу ...»

          Способ 2
          Правой кнопкой на файле
          Свойства
          Вкладка «Общие»
          Кнопка «Изменить» (Напротив пункта «Приложение»)
            0
            Win10 считает себя шибко умной и сбрасывает ассоциации в произвольном порядке.
            (вообще финиш конечно — в OS не работает одна из основных функций)
            0
            Assoc куда быстрее, чем жамкать каждый файл правой кнопкой, изменить применить. Для себя сделать такой на случай переустановки системы — самое то.

            А еще у меня вот такой батник «для юзеров», когда не хочется заражений компа вирусами из почты ну или «откуда-то».
            Понятно, что приходящие обновить 1С или консультант удивляются почему их скриптик обновления не работает. Так же портит работу репаков всяких. Но вирусом шанс заразиться уменьшает.

            бантик, применять осторожно.
            assoc .js=txtfile
            assoc .CMD=txtfile
            assoc .vbs=txtfile
            assoc .com=txtfile
            assoc .hta=txtfile
            assoc .bas=txtfile
            assoc .pif=txtfile
            assoc .GADGET=txtfile
            assoc .VBE=txtfile
            assoc .VB=txtfile
            assoc .jse=txtfile
            assoc .SCR=txtfile
            assoc .wsf=txtfile
            assoc .wsc=txtfile
            assoc .wsh=txtfile

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое