? SFTA.exe Última Actualización 2022-04-17
Probado en: Windows 8, Windows 8.1, Windows 10 Version 1511, Windows 10 Version 1709, Windows 10 Version 1803, Windows 10 Version 1809, Windows 10 Version 1903, Windows 10 Version 1909, Windows 10 Version 20H2, Windows 11 Pro Version 21H2
En nuestra publicación anterior compartimos una herramienta de línea de comandos para asociar una aplicación a un tipo de archivo específico, sin embargo uno de nuestros visitantes no pudo usar la herramienta en su entorno de trabajo ya que por restricciones no podía usar aplicaciones ejecutables de terceros, y nos comentó que él deseaba hacerlo usando PowerShell.
Tomando en cuenta su idea tan interesante y nuestra pasión por el mundo del scripting y sysadmin decidimos crear una versión simple de SFTA en Powershell utilizando como base el comando Add-Type que nos permite compilar código .NET y usarlo en nuestra instancia de PowerShell. Esta es la version antigua del script. Usar la última versión alojada en GitHub.
Antiguo Script de PowerShell usando IApplicationAssociationRegistrationInternal
$sourceCSharp=@"
using System;
using System.Runtime.InteropServices;
namespace SFTA
{
public static class AssocReg
{
[ComImport()]
[Guid("14EBCC88-2831-4FC8-A5DF-9F36A81DB12C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IApplicationAssociationRegistrationInternalW10_1709
{
[PreserveSig]
void Dummy1();
[PreserveSig]
void SetProgIdAsDefault([MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName, [MarshalAs(UnmanagedType.LPWStr)] string pszSet, int atSetType);
[PreserveSig]
void Dummy3();
[PreserveSig]
void Dummy4();
[PreserveSig]
void Dummy5();
[PreserveSig]
void Dummy6();
[PreserveSig]
void QueryCurrentDefault([MarshalAs(UnmanagedType.LPWStr)] string pszExt, int atQueryType, int alQueryLevel, [Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszAssociation);
}
private interface IApplicationAssociationRegistrationInternalW8_1_63
{
[PreserveSig]
void Dummy1();
[PreserveSig]
void SetProgIdAsDefault([MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName, [MarshalAs(UnmanagedType.LPWStr)] string pszSet, int atSetType);
[PreserveSig]
void Dummy3();
[PreserveSig]
void Dummy4();
[PreserveSig]
void Dummy5();
[PreserveSig]
void Dummy6();
[PreserveSig]
void QueryCurrentDefault([MarshalAs(UnmanagedType.LPWStr)] string pszExt, int atQueryType, int alQueryLevel, [Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszAssociation);
}
[ComImport()]
[Guid("591209c7-767b-42b2-9fba-44ee4615f2c7")]
[ClassInterface(ClassInterfaceType.None)]
private class ApplicationAssociationRegistration
{
}
public static bool Debug = false;
private static readonly IApplicationAssociationRegistrationInternalW10_1709 AppAssocReg10 = new ApplicationAssociationRegistration() as IApplicationAssociationRegistrationInternalW10_1709;
private static readonly IApplicationAssociationRegistrationInternalW8_1_63 AppAssocReg8 = new ApplicationAssociationRegistration() as IApplicationAssociationRegistrationInternalW8_1_63;
private static void WriteDebug(string message)
{
if ( Debug)
{
Console.WriteLine(DateTime.Now.ToString("[yyyy.dd.MM HH:mm:ss]") + " "+ message);
}
}
public static void SetFileTypeAssociation(string ProgramId,string Ext)
{
if (AppAssocReg10 != null)
{
WriteDebug("OK AppAssocReg10");
AppAssocReg10.SetProgIdAsDefault(ProgramId, Ext, 0);
return;
}
if (AppAssocReg8 != null)
{
WriteDebug("OK AppAssocReg8");
AppAssocReg8.SetProgIdAsDefault(ProgramId,Ext, 0);
return;
}
WriteDebug("FAIL AppAssocReg");
}
public static string GetFileTypeAssociation( string Ext)
{
if (AppAssocReg10 != null)
{
WriteDebug("OK AppAssocReg10");
var assocApplication = "";
AppAssocReg10.QueryCurrentDefault(Ext, 0, 1, out assocApplication);
WriteDebug("assocApplication = " + assocApplication);
return assocApplication;
}
if (AppAssocReg8 != null)
{
WriteDebug("OK AppAssocReg8");
var assocApplication = "";
AppAssocReg8.QueryCurrentDefault(Ext, 0, 1, out assocApplication);
WriteDebug("assocApplication = " + assocApplication);
return assocApplication;
}
WriteDebug("FAIL AppAssocReg");
return "";
}
}
}
"@
if (-not ([System.Management.Automation.PSTypeName]'SFTA.AssocReg').Type)
{
Add-Type -TypeDefinition $sourceCSharp -Language CSharp
}
$assocProgram=[SFTA.AssocReg]::GetFileTypeAssociation(".pdf")
Write-Host(".PDF Assoc Program = " + $assocProgram)
[SFTA.AssocReg]::SetFileTypeAssociation("Applications\SumatraPDF.exe",".pdf")
PS-SFTA Última Actualización
Ejemplo de uso:
Asignar Acrobat Reader DC como predeterminado para abrir archivos .pdf
Set-FTA AcroExch.Document.DC .pdf
Información adicional:
Asignar Microsoft Edge como predeterminado para abrir archivos .pdf desde la consola de Windows (cmd.exe)
powershell -ExecutionPolicy Bypass -command "& { . .\SFTA.ps1; Set-FTA 'MSEdgePDF' '.pdf' }"
Esperamos que les sea de utilidad!!!
Mi Respeto genios talentosos
Gracias!!!! ?
Como le podría hacer, pero con otra extensión de archivo?, por ejemplo quiero abrir un script PowerShell en PowerShell, pero se me abre en bloc de notas
Hola, simplemente tienes que pasar el Program Id de powershell y la extensión.
powershell -ExecutionPolicy Bypass -command "& { . .\SFTA.ps1; Set-FTA 'Applications\powershell.exe' '.ps1' }"
Saludos
Lo siento, pero no entendí exactamente que debo de hacer, solo llevo 2 semana aprendiendo a programar
Enviame un correo a hello.danysys@gmail.com para enviarte mi telegram ID así me explicas por nota de voz mejor que tratas de hacer.
Saludos
como podria hacer para cambiar la aplicacion predeterminada para que abra fotos con visualidador de windows en vez de paint?
Hola SrLianGe, Lograste solucionarlo?
Hola, Dany. Creo que me había expresado mal. Resulta que me habían hecho descargar el SFTA y lo ejecuté sin saber lo que era. Pero, ahora, estoy preocupado qué es lo que hace y si me va a perjudicar el sistema.
Espero respuesta. Gracias.
Hola, No te preocupes si no lo ejecutaste con ninguna asociación de archivo no pasa nada. Lo unico que puede hacer el script es asociar alguna aplicación con otro programa pero lo puedes revertir facilmente desde las configuraciones de extensiones de Windows. Asi que no pasa nada no deberias tener ningun problema. Saludos