¿Cómo consigo ftype & assoc para que coincida con el Explorador de Windows?

20

Cambié la asociación para usar al iniciar un .pyarchivo, a través del Explorador de Windows:

  1. Herramientas -> Carpetas -> Tipos de archivo.
  2. Luego navega hasta .py.
  3. Cambia la asociación a Wordpad.

Ahora, cuando escribo el nombre de un archivo py en la línea de comando, Wordpad lo abre.

Pero assocy ftypeen la línea de comando aún devuelve lo siguiente:

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

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

¿Cómo es que la asociación está trabajando, pero assocy ftypeno son conscientes de ello?

Reinicié el aviso.


Más información de mi 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

Más registro:

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

Supongo que esto es lo que está apareciendo ftype Python.File. Pero no parece acostumbrarse.


(Estoy haciendo esto para probar, por lo que eventualmente puedo elegir mi versión predeterminada de Python fácilmente).

Gauthier
fuente

Respuestas:

9

Dependiendo de cómo llame a un archivo dependerá de qué verbo se use. El verbo que usa determina lo que Windows hará con él. Los verbos estándar son Abrir, Editar, Imprimir, Reproducir y Vista previa. Sin embargo, es posible crear tus propios verbos . El verbo más comúnmente agregado es la familia Abrir con (incluyendo OpenWithProgIDs), que agrega ese pequeño submenú de contexto en "Abrir con" para ofrecerle posibles alternativas. Si instala Paint.NET, por ejemplo, y luego hace clic con el botón derecho en un archivo .jpg, verá que la entrada Abrir con se expande a un submenú que enumera Paint.NET, Paint y lo que Microsoft llamó el visor de imágenes para su versión de Windows

Además, lo que dijo Unsigned Code Labs es muy importante. Cuando estás depurando clases, debes mirar HKLM\Software\Classes\y HKCU\Software\Classes. HKCRes muy útil para consultar el sistema, pero no es tan bueno para descubrir por qué se está comportando mal.

Hice una pequeña prueba en mi sistema Windows 7 con procmon.exe, y parece que los comandos assocy ftypetratan de escribir directamente HKCR, y el sistema aparentemente interpreta eso como escribir en HKLM. Mi cuenta actual es miembro del grupo de administración, pero UAC está habilitado. Obtuve acceso denegado cuando lo intenté assoc .mytest=MyTest.File.

Curiosamente, si creo una asociación haciendo clic derecho en un archivo llamado test.mytesty asociándolo con el Bloc de notas, assocni ftypeveré esta asociación. La asociación definitivamente está ahí en HKCUy HKCR. Sin embargo, no he intentado reiniciar.

Pedacitos de tocino
fuente
Para futuros lectores
TheIncorrigible1
@ TheIncorrigible1 enlace está muerto :(
DaveInCaz
@DaveInCaz Oh, eso es realmente triste. Me molesta que hayan roto todos los enlaces del blog de MSFT. Veré si puedo restaurarlo; ojalá solo tenga un nuevo enlace y no desaparezca (como es el caso de algunas otras cosas)
TheIncorrigible1
@DaveInCaz Era tan popular que otro blog lo volvió a publicar 😀
TheIncorrigible1
5

No sé cómo puedes hacer la coincidencia entre el registro y lo que aparece en ftype y assoc. Para mí y como te veo también, el comando ftype y assoc son inútiles. Lo que hago para cambiar el programa predeterminado para una extensión dada de forma programática (frente a la forma estándar y más simple de usar el explorador) es modificar esta clave de registro

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

Por ejemplo, si quiero abrir mis mp3 con mplayer pongo

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

el valor de "mplayerc.mp3"

¿Cuál es la complicación de hacer esto? Primero, necesita conocer los ProgID válidos (use ftype), y segundo, necesita acceso de escritura a esa colmena. Windows coloca automáticamente una ACL de denegación para la clave UserChoice, por lo que debe encontrar una manera de eliminar esa regla de denegación para obtener el acceso de escritura. Utilizo el programa subinacl, que puedes descargar desde aquí http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&displaylang=en para modificar los permisos. También puede usar el programa de terceros SetACL. Recomiendo el primero porque la sintaxis es mucho más simple.

mjsr
fuente
3

Explorer (el shell de Windows) siempre da preferencia a la aplicación especificada en la clave del proveedor que se especifica bajo el valor predeterminado de la extensión. (En su caso, .pyes la extensión, Python.Filees la clave del proveedor).

ftypey assocpuedo leer sus valores de otras áreas, no estoy seguro. Así es como lo hace Explorer.

EDITAR: Esta página puede ser de su interés: MSDN - Tipos de archivos

Especialmente esto:

El subárbol HKEY_CLASSES_ROOT es una vista formada al fusionar HKEY_CURRENT_USER \ Software \ Classes y HKEY_LOCAL_MACHINE \ Software \ Classes.

Quizás aquí es donde las diferentes partes de Windows entran en conflicto, si hay una asociación "predeterminada" en HKEY_LOCAL_MACHINE, que está siendo anulada por la que definió en su cuenta (que luego se almacenaría en HKEY_CURRENT_USER).


fuente
3

Microsoft ha cambiado cómo funciona esto desde Windows 8 en adelante. Ya no es posible editar el registro para cambiar esto. Para citar a Microsoft :

En Pre-Win 8, las aplicaciones podrían establecer el controlador predeterminado para un tipo de archivo / protocolo manipulando el registro, esto significa que podría tener fácilmente un script o una política de grupo manipulando el registro. Sin embargo, en Win 8, los cambios en el registro se verifican mediante un hash (único por usuario y aplicación) que detecta la manipulación por parte de las aplicaciones. En ausencia de un hash válido, ignoramos el valor predeterminado en el registro.

La forma en que Microsoft espera que cambie esto ahora es con un archivo xml que se implementa a través de la Política de grupo. Instrucciones aquí .

Afortunadamente, Christoph Kolbicz realizó una ingeniería inversa del algoritmo de hash y creó una herramienta llamada SetUserFTA para establecer la asociación del tipo de archivo. Lamentablemente es de código cerrado.

pholcroft
fuente
SetUserFTA es súper útil y puede ser programado.
DaveInCaz
1

La confusión aquí es entre lo que se usa para abrir un archivo y lo que se usa para ejecutar un archivo. La clave de registro

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

es lo que le dice a Windows cómo abrir el archivo. Al hacer doble clic en el archivo, se abrirá el archivo con esta aplicación.

Como el archivo no es un archivo ejecutable, la línea de comando asume que desea abrir el archivo con la aplicación predeterminada, como si hubiera hecho doble clic en él.

Cambiar la asociación de nuevo a C: \ Programme \ Python27 \ python.exe o editar la clave de registro para que apunte a python debería devolverlo a lo que solía ser, donde Windows asume que desea abrir el archivo con el programa predeterminado, que es python.exe, que luego ejecuta el programa.

Majenko
fuente
Si entiendo correctamente, la clave .py\Applicationse utiliza para abrir los archivos py. Lo que no entiendo es en qué casos Python.Filese utiliza el valor .
Gauthier
Según Majenko, depende del clima dado que la extensión es tratada por Windows como ejecutable (ver PATHEXTvariable). Sin embargo, recuerdo haber leído en el pasado que los asociados hechos desde Explorer siempre sobrescriben los de la Classesclave de registro.
Piotr Dobrogost
1

Su mayor pista sobre el propósito y la ubicación está en el "tipo grande", es decir, los nombres de las respectivas colmenas: HKLM y HKCU

Las asociaciones de archivos se establecen en ambas colmenas y tienen dos propósitos diferentes:

Como su nombre lo indica, las entradas del registro HKCU establecen asociaciones de archivos para el USUARIO ACTUAL y anulan la configuración del tipo de archivo correspondiente en HKLM.

HKLM establece asociaciones de archivos para la MÁQUINA LOCAL, es decir, para TODOS LOS USUARIOS de la máquina (a menos que sea anulada por las entradas HKCU). (Para Win98, HKCR era solo un alias abreviado para HKLM \ Software \ Classes. No eran colmenas separadas o diferentes. Sin embargo, esto cambió para Win XP y ya no es cierto. HKCR ahora es una colmena virtual que es el resultado de la fusión las teclas HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ y HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts con prioridad sobre la información HKCU).

Este sistema de dos pasos facilita no solo esquemas de asociación de archivos uno a uno sino muchos a uno y uno a muchos. Por ejemplo, los tipos de archivo .htm, .html y .shtml podrían establecerse en ProgID = htmlfile, lo que a su vez podría definir un solo navegador. OTOH, las entradas pueden contener subclaves OpenWithList o OpenWithProgID con múltiples entradas para abrir un archivo de una lista de múltiples navegadores, editores u otras aplicaciones.

Tanto HKLM \ Software \ Classes \ como HKCU \ Software \ Classes funcionan de la misma manera (una solo tiene prioridad sobre la otra). En la forma más simple, hay una clave de registro para una extensión de archivo (por ejemplo, HKCR.txt) cuyo valor predeterminado es el ProgID correspondiente (por ejemplo, txtfile). Además de, o en lugar de, el valor predeterminado, puede haber nombres ProgID adicionales enumerados para la subclave "OpenWithProgID" (por ejemplo, txtfile y htmlfile), y / o nombres de aplicaciones adicionales que aparecen como subclaves en "OpenWithList" (por ejemplo, Notepad ++ .exe, Opera.exe, Firefox.exe).

Cada ProgID se define en otra clave dentro de HKCR (por ejemplo, HKCR \ txtfile). Esta tecla contiene subclaves para indicarle a Windows qué icono usar y cómo abrir, imprimir, imprimir, etc., el archivo asociado (por ejemplo, HKCR \ txtfile \ shell \ open \ command). Del mismo modo, cada nombre de aplicación se define como una subclave en HKCR \ Aplicaciones (por ejemplo, HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Además de la clave HKCU \ Software \ Classes, las asociaciones de archivos de cuenta de usuario se encuentran en la clave HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Estas entradas no son solo para el Explorador de Windows, como se ha sugerido, sino que son una fuente adicional de anulaciones de asociación de archivos de cuentas de usuario. Las entradas son creadas por las herramientas de asociación de archivos en el explorador (Explorer \ Tools \ Opciones de carpeta \ Tipos de archivo) y contienen una subclave OpenWithList y / o OpenwithProgID para cada extensión de archivo enumerada.

Para determinar una asociación de archivos, Windows primero busca las entradas HKCU para una extensión de archivo correspondiente. Solo si no se encuentra uno, entran en juego las entradas HKLM. (Nota: no he probado cuál tiene prioridad: HKCU \ Software \ Classes o HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts, pero sospecho que sería la clave FileExts). Del mismo modo, si no se encuentra un ProgID o nombre de aplicación referenciado en HKCU, se buscan las entradas HKLM. (Tenga en cuenta que las entradas \ Aplicaciones \ son solo nombres arbitrarios, aunque normalmente son idénticas al nombre real del archivo exe del disco).

Entonces, para definir una asociación de archivos para una cuenta de usuario específica, cree entradas en la sección HKCU. Para definir una asociación para todos los usuarios, cree entradas en la sección HKLM (HKCR) y elimine todas las referencias en la sección HKCU a ese tipo de archivo. Obviamente, necesita los derechos de acceso adecuados a las claves de registro.

No uso las herramientas assoc y ftype, ya que prefiero usar RegEdit en modo interactivo o por lotes, pero por otros comentarios parece que solo funcionan en la sección HKLM y son inútiles para borrar / configurar las claves HKCU. Tómese un tiempo y explore las teclas mencionadas anteriormente con RegEdit para ver más ejemplos.

ArtKns
fuente
HKCR no funciona de la manera que piensas. En HKCR, tengo una entrada de "código fuente". "código fuente" no existe en HKLM \ Software \ Classes. Por otro lado, en HKCU \ Software \ Classes, el "código fuente" está presente. Entonces, obviamente, HKCR incluye entradas de HKCU \ Software \ Classes. Por otro lado, tanto en HKCR como en HKLM, "SoundRec" y "SPCFile" están presentes. Pero HKCU \ Software \ Classes no tiene estos. Por lo tanto, HKCR obviamente también incluye entradas de HKLM. HKCR definitivamente está fusionando las dos ubicaciones de alguna manera. También vea superuser.com/a/266274
Ben