Как изменить ассоциацию типа файла в реестре?

Другой способ подобен этому:

multiple_cmd() { 
    tail -n1 $1; 
    ls $1 
}; 
export -f multiple_cmd; 
find *.txt -exec bash -c 'multiple_cmd "[110]"' {} \;

в одну строку

multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "[111]"' {} \;
  • «multiple_cmd()» - это функция
  • »export -f multiple_cmd "- экспортирует его таким образом, чтобы его мог увидеть любой другой подоболочек
  • " find *.txt -exec bash -c 'multiple_cmd "[114]"' {} \; "- найдите, что будет выполнять функцию на вашем примере

Таким образом, можно создать multip_cmd так долго и так сложно, как тебе нужно.

Надеюсь, это поможет.

12
задан Sergio Tapia 4 July 2009 в 20:05
поделиться

4 ответа

В дополнение к уже предоставленным ответам вы можете выполнить это, вызвав программы командной строки «ASSOC» и «FTYPE». FTYPE связывает тип файла с программой. ASSOC связывает расширение файла с типом файла, указанным через FTYPE. Например:

FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %*
ASSOC .smc=SMCFile

Это сделает необходимые записи в реестре. Для получения дополнительных сведений введите в командной строке ASSOC /? или FTYPE /? .

28
ответ дан 2 December 2019 в 03:43
поделиться

Если вы планируете предоставить установщик для своего приложения, просто используйте функцию ассоциации файлов, доступную в любой структуре установщика, которую вы решите использовать - даже в Проект установки Visual Studio знает, как это сделать.

Чтобы изменить ассоциации типов файлов непосредственно из вашего кода, я считаю, что вам нужно изучить HKEY_CLASSES_ROOT и найти / создать ключ с расширением, которое вы хотите привязать в (например, ".pdf"). В этом ключе значением по умолчанию является строка, содержащая ссылку на другой ключ в HKEY_CLASSES_ROOT . Следуйте за этим указателем, разверните / создайте подраздел оболочки и добавьте / измените здесь свои команды. Осмотрите эту область с помощью regedit , чтобы понять, как это выглядит.

У меня есть некоторый код C # в моем домашнем проекте, который ищет привязку для файлов PDF и добавляет дополнительную опцию в их контекстные меню. Не стесняйтесь посмотреть .

1
ответ дан 2 December 2019 в 03:43
поделиться

Используйте класс Registry в Microsoft.Win32 .

В частности, вам нужно свойство ClassesRoot для ] Реестр для доступа к ключу HKEY_CLASSES_ROOT (см. Общие сведения об ассоциациях файлов MS Windows и HKEY_CLASSES_ROOT: основные службы ).

using Microsoft.Win32;
Registry
    .ClassesRoot
    .CreateSubKey(".smc")
    .SetValue("", "SMC", RegistryValueKind.String);
Registry
    .ClassesRoot
    .CreateSubKey("SMC\shell\open\command")
    .SetValue("", "SMCProcessor \"%1\"", RegistryValueKind.String);

Заменить "SMCProcessor \"% 1 \ "" с путем в командной строке и спецификацией аргумента для программы, которую вы хотите связать с файлами с расширением .smc .

Но вместо того, чтобы путаться с реестром, почему бы просто не сказать

Process.Start("SMCProcessor blblabla.smc");
8
ответ дан 2 December 2019 в 03:43
поделиться

Использование Python:

EXT, EXT_TYPE = ".xyz", "XYZ file"
EXE_PATH = r"path\to\my\exe"

# %L is the long (full path) version of path
extCmd = '"%s" "%%L" %%*' % EXE_PATH

# Using assoc and ftype easier than editing registry!
assert os.system('assoc %s=%s' % (EXT, EXT_TYPE))==0
assert os.system('ftype %s=%s' % (EXT_TYPE, extCmd))==0

Ассоциирование иконки с типом расширения:

import _winreg

try:
    ext = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, EXT_TYPE)
    _winreg.SetValue(ext, "DefaultIcon", _winreg.REG_SZ, ICON_PATH)
    _winreg.CloseKey(ext)
except WindowsError:
    print "Error associating icon"

Регистрация расширения как исполняемого типа (т.е. PATHEXT):

try:
    key = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'

    reg = _winreg.ConnectRegistry( None, _winreg.HKEY_LOCAL_MACHINE )

    # get current value
    ext = _winreg.OpenKey(reg, key)
    pathext = _winreg.QueryValueEx(ext, 'PATHEXT')[0]

    if not EXT in pathext:
        _winreg.CloseKey(ext)

        # modify the current value            
        ext = _winreg.OpenKey(reg, key, 0, _winreg.KEY_ALL_ACCESS)
        pathext += ';' + EXT
        _winreg.SetValueEx(ext, 'PATHEXT', 0, _winreg.REG_SZ, pathext)
        _winreg.CloseKey(ext)

    _winreg.CloseKey(reg)

except WindowsError:
    print "Error adding to PATHEXT"

Кроме того, чтобы PATHEXT распознавался без повторного входа в систему, можно обновить среду: (спасибо Enthought за это)

def refreshEnvironment():        
    HWND_BROADCAST      = 0xFFFF
    WM_SETTINGCHANGE    = 0x001A
    SMTO_ABORTIFHUNG    = 0x0002
    sParam              = "Environment"

    import win32gui
    res1, res2          = win32gui.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, sParam, SMTO_ABORTIFHUNG, 100)
3
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: