Como faço para que ftype & assoc correspondam ao Windows Explorer?


20

Alterei a associação a ser usada ao iniciar um .pyarquivo, via Windows Explorer:

  1. Ferramentas -> Pastas -> Tipos de arquivos.
  2. Então navegue para .py.
  3. Mude a associação para Wordpad.

Agora, quando digito o nome de um arquivo py na linha de comando, o Wordpad o abre.

Mas assoce ftypena linha de comando ainda retorne o seguinte:

C:\> assoc .py
.py = Python.File

C:\> ftype Python.File
Python.File = "C:\Program\Python27\python.exe" "%1" %*

Como é que a associação está funcionando, mas assoce ftypenão está ciente disso?

Eu reiniciei o prompt.


Mais informações do meu registro:

HKEY_CLASSES_ROOT\.py
= Python.File

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
= wordpad.exe

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\OpenWithProgids\Python.File
= 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py\(Standard)
= Python.File

Mais registro:

HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command\(Standard)
= "C:\Program\Python27\python.exe" "%1" %*`

Suponho que é isso que está aparecendo ftype Python.File. Mas isso não parece se acostumar.


(Estou fazendo isso para teste, para que eu possa eventualmente escolher minha versão padrão do Python facilmente).


Respostas:


9

Dependendo de como você chama um arquivo, depende do verbo usado. O verbo que você usa determina o que o Windows fará com ele. Os verbos padrão são Abrir, Editar, Imprimir, Reproduzir e Visualizar. No entanto, é possível criar seus próprios verbos . O verbo mais comumente adicionado é a família Abrir com (incluindo o OpenWithProgIDs), que adiciona esse submenu de contexto em "Abrir com" para fornecer alternativas possíveis. Se você instalar o Paint.NET, por exemplo, e clicar com o botão direito do mouse em um arquivo .jpg, a entrada Abrir com será expandida para um submenu que lista o Paint.NET, o Paint e o que a Microsoft chamou de visualizador de imagens para sua versão do Windows.

Além disso, o que a Unsigned Code Labs disse é muito importante. Quando você está depurando classes, precisa observar HKLM\Software\Classes\e HKCU\Software\Classes. HKCRé muito útil para consultar o sistema, mas não é tão bom para descobrir por que está se comportando mal.

Fiz um pequeno teste no meu sistema Windows 7 com procmon.exe, e os comandos assoce ftypeparecem tentar gravar diretamente HKCR, e o sistema aparentemente interpreta isso como escrevendo para HKLM. Minha conta atual é membro do grupo de administradores, mas o UAC está ativado. O acesso foi negado quando tentei assoc .mytest=MyTest.File.

Estranhamente, se eu criar uma associação clicando com o botão direito do mouse em um arquivo chamado test.myteste associando-o ao Bloco de Notas, ele também assocnão ftypevê essa associação. A associação está definitivamente lá dentro HKCUe HKCR. Eu não tentei reiniciar, no entanto.



O link @ TheIncorrigible1 está morto :(
DaveInCaz 26/03

@DaveInCaz Oh, isso é realmente triste. Estou irritado por terem quebrado todos os links do blog MSFT. Vou ver se consigo restaurá-lo; espero que apenas tenha um novo link e não desapareça (como é o caso de algumas outras coisas)
TheIncorrigible1


5

não sei como você pode fazer a correspondência entre o registro e o que aparece no ftype e assoc. Para mim e como eu vejo você também, o comando ftype e assoc é inútil. O que eu faço para alterar o programa padrão de uma extensão dada de maneira programática (em comparação com a maneira mais simples e padrão usando o explorer) é modificar essa chave do registro

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TheExtensionYouWantToModify\UserChoice\ProgID

Por exemplo, se eu quiser abrir meus mp3s com o mplayer, coloquei

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice\ProgID 

o valor de "mplayerc.mp3"

Qual é a complicação de fazer isso: primeiro você precisa conhecer ProgIDs válidos (use ftype) e, em segundo lugar, você precisa ter acesso de gravação a essa seção. O Windows coloca automaticamente uma ACL de negação para a chave UserChoice, portanto, você precisa encontrar uma maneira de remover essa regra de negação para obter o acesso de gravação. Eu uso o programa subinacl, que você pode baixar aqui http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en para modificar as permissões. Além disso, você pode usar o programa de terceiros SetACL. Eu recomendo o primeiro porque a sintaxe é muito mais simples.


3

O Explorer (o shell do Windows) sempre dá preferência ao aplicativo especificado na chave do fornecedor, especificada no valor padrão da extensão. (No seu caso, .pyé a extensão, Python.Fileé a chave do fornecedor.)

ftypee assocpode ler seus valores de outras áreas, não sei ao certo. É assim que o Explorer faz isso.

EDIT: Esta página pode ser do seu interesse: MSDN - Tipos de Arquivos

Especialmente isso:

A subárvore HKEY_CLASSES_ROOT é uma exibição formada pela fusão de HKEY_CURRENT_USER \ Software \ Classes e HKEY_LOCAL_MACHINE \ Software \ Classes.

Talvez seja aqui que as diferentes partes do Windows se chocam, se houver uma associação "padrão" em HKEY_LOCAL_MACHINE, que será substituída pela que você definiu em sua conta (que seria armazenada em HKEY_CURRENT_USER).


3

A Microsoft mudou a maneira como isso funciona a partir do Windows 8. Não é mais possível editar o registro para alterar isso. Para citar a Microsoft :

No Pre-Win 8, os aplicativos podiam definir o manipulador padrão de um tipo / protocolo de arquivo manipulando o registro, o que significa que você poderia facilmente ter um script ou uma política de grupo manipulando o registro. No entanto, no Win 8, as alterações no registro são verificadas por um hash (exclusivo por usuário e aplicativo) que detecta a violação de aplicativos. Na ausência de um hash válido, ignoramos o padrão no registro.

A maneira como a Microsoft espera que você altere isso agora é com um arquivo xml implementado por meio da Diretiva de Grupo. Instruções aqui .

Felizmente, Christoph Kolbicz fez a engenharia reversa do algoritmo de hash e criou uma ferramenta chamada SetUserFTA para definir a associação do tipo de arquivo. Infelizmente, é de código fechado.


SetUserFTA é super útil e pode ser script.
DaveInCaz 03/04

1

A confusão aqui é entre o que é usado para abrir um arquivo e o que é usado para executar um arquivo. A chave do registro

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
\.py\Application

é o que informa ao Windows como abrir o arquivo. Clicar duas vezes no arquivo abrirá o arquivo com este aplicativo.

Como o arquivo não é um arquivo executável, a linha de comando pressupõe que você deseja abrir o arquivo com o aplicativo padrão, como se você tivesse clicado duas vezes nele.

Alterar a associação de volta para C: \ Program \ Python27 \ python.exe ou editar a chave do registro para apontar para python deve retorná-la ao modo como costumava ser, onde o Windows pressupõe que você deseja abrir o arquivo com o programa padrão, que é o python.exe, que executa o programa.


Se bem entendi, a chave .py\Applicationé usada para abrir os arquivos py. O que eu não entendo é em que casos o valor Python.Fileé usado.
quer

De acordo com Majenko, depende do clima, já que a extensão é tratada pelo Windows como executável (consulte a PATHEXTvariável). No entanto, lembro-me de ler no passado que os associados criados no Explorer sempre substituem os da Classeschave do registro.
Piotr Dobrogost 28/10/12

1

Sua maior pista para o propósito e localização está no "tipo grande", ou seja, os nomes das respectivas colméias: HKLM e HKCU

As associações de arquivos são definidas nas duas seções e têm dois propósitos diferentes:

Como o nome indica, as entradas do Registro HKCU definem associações de arquivos para o USUÁRIO ATUAL e substituem as configurações de tipo de arquivo correspondentes no HKLM.

O HKLM define associações de arquivos para o LOCAL MACHINE, ou seja, para TODOS OS USUÁRIOS da máquina (a menos que sejam substituídos pelas entradas do HKCU). (No Win98, o HKCR era apenas um alias abreviado para HKLM \ Software \ Classes. Eles não eram seções separadas ou diferentes. No entanto, isso foi alterado para o Win XP e não é mais verdadeiro. O HKCR agora é uma seção virtual resultante da fusão as chaves HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ e HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts com as informações do HKCU prevalecendo.)

Esse sistema de duas etapas facilita não apenas os esquemas de associação de arquivos um para um, mas muitos para um e um para muitos. Por exemplo, os tipos de arquivo .htm, .html e .shtml podem ser definidos como ProgID = htmlfile, que por sua vez pode definir um único navegador. OTOH, as entradas podem conter subchaves OpenWithList ou OpenWithProgID com várias entradas para abrir um arquivo de uma lista de vários navegadores, editores ou outros aplicativos.

HKLM \ Software \ Classes \ e HKCU \ Software \ Classes operam da mesma maneira (uma apenas tem precedência sobre a outra). Na forma mais simples, existe uma chave de registro para uma extensão de arquivo (por exemplo, HKCR.txt) cujo valor padrão é o ProgID correspondente (por exemplo, txtfile). Além do valor padrão, ou em vez do valor padrão, pode haver nomes adicionais de ProgID listados para a subchave "OpenWithProgID" (por exemplo, txtfile e htmlfile) e / ou nomes de aplicativos adicionais que aparecem como subchaves em "OpenWithList" (por exemplo, Notepad ++ .exe, Opera.exe, Firefox.exe).

Cada ProgID é definido em outra chave no HKCR (por exemplo, HKCR \ txtfile). Essa chave contém subchaves para informar ao Windows qual ícone usar e como abrir, imprimir, imprimir etc. o arquivo associado (por exemplo, HKCR \ txtfile \ shell \ open \ command). Da mesma forma, cada nome de aplicativo é definido como uma subchave em HKCR \ Applications (por exemplo, HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Além da chave HKCU \ Software \ Classes, as associações de arquivos da conta do usuário são encontradas na chave HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Essas entradas não são apenas para o Windows Explorer, como foi sugerido, mas são uma fonte adicional de substituições de associação de arquivos de contas de usuários. As entradas são criadas pelas ferramentas de associação de arquivos no explorer (Explorer \ Tools \ Opções de Pasta \ Tipos de Arquivos) e contêm uma subchave OpenWithList e / ou OpenwithProgID para cada extensão de arquivo listada.

Para determinar uma associação de arquivos, o Windows procura primeiro nas entradas HKCU uma extensão de arquivo correspondente. Somente se um não for encontrado, as entradas HKLM entrarão em jogo. (Observação: não testei o que tem precedência - o HKCU \ Software \ Classes ou HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts, mas suspeito que seria a chave FileExts). Da mesma forma, se um ProgID ou nome de aplicativo referenciado não for encontrado no HKCU, as entradas HKLM serão pesquisadas. (Observe que as entradas \ Applications \ são apenas um nome arbitrário - mesmo que normalmente sejam idênticas ao nome real do arquivo exe no disco).

Portanto, para definir uma associação de arquivo para uma conta de usuário específica, crie entradas na seção HKCU. Para definir uma associação para todos os usuários, crie entradas na seção HKLM (HKCR) e exclua todas as referências na seção HKCU para esse tipo de arquivo. Obviamente, você precisa dos direitos de acesso apropriados às chaves do registro.

Não uso as ferramentas assoc e ftype, pois prefiro usar o RegEdit no modo interativo ou em lote, mas a partir de outros comentários, parece que eles operam apenas na seção HKLM e são inúteis para limpar / configurar as chaves HKCU. Reserve um tempo e navegue pelas teclas acima mencionadas com o RegEdit para ver mais exemplos.


O HKCR não funciona da maneira que você pensa. No HKCR, tenho uma entrada "código fonte". "código-fonte" não existe no HKLM \ Software \ Classes. Por outro lado, em HKCU \ Software \ Classes, "código-fonte" está presente. Portanto, obviamente, o HKCR inclui entradas de HKCU \ Software \ Classes. Por outro lado, no HKCR e no HKLM "SoundRec" e "SPCFile" estão presentes. Mas HKCU \ Software \ Classes não possui esses. Portanto, o HKCR também inclui obviamente entradas do HKLM. A HKCR está definitivamente mesclando os dois locais de alguma forma. Veja também superuser.com/a/266274
Ben
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.