Script para asociar una extensión a un programa
-
03-07-2019 - |
Pregunta
Mi cliente está reemplazando MS Office con OpenOffice en algunas estaciones de trabajo. Mi programa exporta un archivo a Excel usando la extensión .xml (usando el formato abierto) y lo abre usando el programa asociado actual (usando ShellExecute)
El problema es que OpenOffice no registra la extensión .xml asociada a ella.
La asociación manual funciona bien, pero quiero hacer un .reg o algo para cambiar fácilmente la configuración.
Estoy buscando en el registro en una PC con el cambio ya realizado, pero el
"HKEY_CLASSES_ROOT\.xml"
La tecla no tiene nada que haga referencia a OpenOffice.
¿Dónde está almacenada la asociación? ¿Cómo puedo hacer un script para hacer el trabajo?
Solución
La asociación real se almacena en la clave que " HKEY_CLASSES_ROOT \ .xml "
apunta.
En mi máquina, el valor predeterminado de esa clave dice " xmlfile "
, lo más probable es que sea igual para la tuya.
Así que vamos a " HKEY_CLASSES_ROOT \ xmlfile "
. Allí puede ver (y cambiar) qué comando se utilizará para iniciar ese tipo de archivo:
HKEY_CLASSES_ROOT\xmlfile\shell\open\command
Windows usa este tipo de redirección para asignar múltiples extensiones de archivo al mismo tipo de archivo y, por lo tanto, a la misma aplicación.
En " HKEY_CLASSES_ROOT \ xmlfile \ shell "
hay varias subclaves que se parecen a los " verbos " de lo que puede hacer al archivo. Nuevamente, el valor predeterminado de la tecla " shell "
decide cuál de estos verbos se usa si hace doble clic en el archivo. En mi caso, esto es " abierto "
.
Conclusión :
Con ese conocimiento, la forma más fácil de hacer que una asociación pueda ejecutarse en una secuencia de comandos es usar regedit para exportar un archivo .reg que contenga ese cambio, y aplicarlo a la computadora de destino con un doble clic o:
regedit /s new_xml_association.reg
o (si estás en XP o superior y sabes lo que haces) sobrescribe el valor actual con:
reg add "HKEY_CLASSES_ROOT\xmlfile\shell\open\command" /ve /d "path\to\program %1"
En cualquier caso, se recomienda una mirada más profunda del comando reg add /?
. La primera solución es más segura.
Otros consejos
considere el comando dos assoc
:
C: > assoc /? Muestra o modifica la extensión del archivo asociaciones
ASSOC [.ext [= [fileType]]]
.ext Especifica el archivo extensión para asociar el tipo de archivo with fileType Especifica el archivo escriba para asociar con el archivo extensión
Escriba ASSOC sin parámetros para mostrar las asociaciones de archivos actuales. Si se invoca ASSOC con solo un archivo extensión, muestra el actual asociación de archivos para ese archivo extensión. No especifique nada para el tipo de archivo y el comando se eliminará la asociación para el archivo extensión.
El uso de asociaciones de archivos en este caso parece ser algo incorrecto. Usted desea que su aplicación abra el archivo en OpenOffice, pero ¿qué sucede si su usuario desea dejar intacta la asociación de archivos XML? ¿Y si algo más en su sistema también se basa en esa asociación? Estás rompiendo su sistema en ese caso. Si usted es la persona de TI, entonces quizás esté bien (práctica de programación aún cuestionable), pero si no, entonces es algo malo.
Utilice la implementación COM de OpenOffice para abrir el archivo en su lugar.
Buen ejemplo simple aquí: http://www.kalitech.fr/clients/doc/VB_APIOOo_en.html
Acabo de encontrar esto mientras buscaba la misma respuesta. Encontré una mejor solución utilizando la API FindExecutable de Windows, que puede usarse desde C # usando PInvoke.