- WSH permet crear accessos .lnk i .url des de VBScript, VBA, VB6, VFP i PowerShell amb lobjecte WScript.Shell.
- En desplegaments IT, el context (usuari vs SYSTEM) decideix si fer servir escriptori públic o de l'usuari.
- Amb MSIX/PSF, AppExecutionAlias evita rutes amb versió i facilita accessos duradors.
- Icones, arguments, hotkeys i estils de finestra es controlen amb propietats de l'accés directe.
Crear dreceres no és només un gest de comoditat: és una forma d'automatitzar tasques i millorar la productivitat dia a dia a Windows. Windows Script Host (WSH) ofereix una via senzilla i potent per generar enllaços a aplicacions, documents i adreces web des de múltiples llenguatges de scripting.
En aquesta guia pràctica reunim tècniques provades amb VBScript, PowerShell, Visual Basic, Visual FoxPro i escenaris moderns amb paquets MSIX i PSF. L'objectiu és que puguis triar l'enfocament que encaixi millor amb el teu entorn (usuari final, IT, Intune/SCCM o empaquetat), i que l'apliquis amb garanties.
Què és Windows Script Host i per què t'interessa
Windows Script Host és la infraestructura que permet executar VBScript i JScript de forma nativa a Windows, a més d'exposar un model d'objectes COM per automatitzar tasques del sistema. L'objecte WScript.Shell és la peça clau per crear dreceres d'escriptori, del menú Inici o de carpetes especials.
WSH forma part de Windows des de versions com Windows 98 i 2000, i es pot afegir a edicions antigues com Windows NT 4.0 mitjançant components opcionals. En els sistemes moderns ve integrat i, a la pràctica, només cal comptar amb els executables wscript.exe i cscript.exe per llançar scripts.
Requisits i bones pràctiques abans de començar
Abans de posar fil a l'agulla convé revisar alguns punts bàsics. Verifica que WSH està disponible i que no hi ha polítiques que bloquegin lexecució de scripts. En entorns corporatius, les GPO i la configuració d'antivirus poden afectar VBScript o PowerShell.
Evita omplir lescriptori amb accessos directes. Només crea accessos quan aportin valor i, si els distribueixes de forma centralitzada, defineix un criteri clar (p. ex., carpetes de treball o aplicacions corporatives crítiques).
Si l'script s'executa com SYSTEM o en context de màquina (Intune/SCCM), pensa bé on escriuràs el .lnk: potser et convingui l'escriptori públic (C:\\Users\\Public\\Desktop) en lloc de l'escriptori de l'usuari actual.
comprova la ruta de destinació, permisos i variables d'entorn. Un error típic és apuntar a rutes amb versions canviants (Program Files\\WindowsApps) o fer servir UNC sense accés del compte que executa l'script.
Carpetes especials i com resoldre les rutes
WSH resol noms de carpetes especials a la ruta real mitjançant WshShell.SpecialFolders. Entre les més útils hi ha Desktop, StartMenu, Programs, Startup o Favorites, a més de les seves variants per a tots els usuaris (AllUsersDesktop, AllUsersStartMenu, etc.). Això et permet ser independent de l'idioma i l'estructura exacta del perfil.
Si treballes amb Visual Basic clàssic o desitges obtenir rutes des d'API, pots recórrer a SHGetSpecialFolderLocation/SHGetPathFromIDList per enumerar rutes com a Escriptori, Programes o Documents recents. És útil quan integres en aplicacions que no depenen directament de lobjecte WScript.
Patró bàsic: crear dreceres amb WScript.Shell
El flux és senzill: crees la instància COM, generes l'accés directe, emplenes propietats i guardes. Aquest patró es repeteix a VBScript, VBA, VB6, VFP i PowerShell amb petites variacions de sintaxi.
' VBScript: acceso directo a una aplicación
Dim sh, lnk
Set sh = CreateObject("WScript.Shell")
Dim escritorio: escritorio = sh.SpecialFolders("Desktop")
Set lnk = sh.CreateShortcut(escritorio & "\\MiApp.lnk")
lnk.TargetPath = "%windir%\\notepad.exe"
lnk.IconLocation = "%windir%\\system32\\shell32.dll,0"
lnk.Arguments = ""
lnk.WorkingDirectory = "%windir%"
lnk.WindowStyle = 4 ' Normal (3 maximizada, 7 minimizada)
lnk.Save
En VBA/VB6 el patró és equivalent, només canvia la sintaxi i on allotges el codi. Podeu crear l'accés a l'escriptori, assignar descripció, icona, tecla ràpida (Hotkey) i estil de finestra:
' VBA/VB6: crear acceso con icono y hotkey
Dim sh As Object, sc As Object
Set sh = CreateObject("WScript.Shell")
Dim destino As String: destino = sh.SpecialFolders("Desktop") & "\\BlocDeNotas.lnk"
Set sc = sh.CreateShortcut(destino)
With sc
.TargetPath = "%windir%\\system32\\notepad.exe"
.WorkingDirectory = "%windir%\\system32"
.IconLocation = "%windir%\\system32\\shell32.dll,2"
.Description = "Abrir el Bloc de notas"
.Hotkey = "ALT+CTRL+N"
.WindowStyle = 4
.Save
End With
Amb Visual FoxPro també podeu utilitzar l'objecte WScript.Shell. La idea és idèntica: localitzar Desktop, crear el .lnk i establir propietats com WindowStyle, IconLocation, TargetPath o la combinació de tecles.
* Visual FoxPro: crear acceso directo de ejemplo
LOCAL sh, desk, sc
sh = CREATEOBJECT("WScript.Shell")
desk = sh.SpecialFolders("Desktop")
sc = sh.CreateShortcut(desk + "\\EjemploWSH.lnk")
sc.TargetPath = "%windir%\\notepad.exe"
sc.IconLocation = "C:\\Path\\a\\miicono.ico"
sc.Hotkey = "ALT+CTRL+F"
sc.WindowStyle = 3 && 3=max 7=min 4=normal
sc.Save
En tots els casos, el nucli és el mateix: CreateShortcut, TargetPath, Save. A partir d'aquí, personalitzeu arguments, icona, directori de treball i estil de finestra segons necessiteu.
Arguments, estil de finestra, icones i tecles ràpides
Quan l'accés ha de llançar una app amb paràmetres, només cal omplir .Arguments. Perquè el procés arrencada en una carpeta concreta, utilitza .WorkingDirectory amb la ruta adequada.
Per a l'aspecte, defineix .IconLocation apuntant a un .ico oa un recurs en un .exe/.dll (pots indicar índex després de la coma). El comportament en obrir es controla amb .WindowStyle: 3 maximitzada, 7 minimitzada, 4 normal.
Si vols una combinació de tecles, fes servir .Hotkey amb el patró ALT+CTRL+Lletra (per exemple, ALT+CTRL+N). Aquesta assignació accelera l'obertura, però no és recomanable assignar massa per no interferir amb dreceres del sistema.
Dreceres de tipus URL (.url)
A més de .lnk d'aplicacions, WSH pot crear accessos .url que obre el navegador per defecte. El TargetPath apunta a l'adreça web i, si necessiteu una icona pròpia, podeu editar després el fitxer .url per afegir IconFile i IconIndex.
' VBScript: acceso directo a una URL
Dim sh, urlShortcut
Set sh = CreateObject("WScript.Shell")
Dim desk: desk = sh.SpecialFolders("Desktop")
Set urlShortcut = sh.CreateShortcut(desk & "\\SitioCorporativo.url")
urlShortcut.TargetPath = "https://www.ejemplo.com"
urlShortcut.Save
' (Opcional) reabrir el .url como texto y añadir:
' IconFile=C:\\Rutas\\icono.ico
' IconIndex=0
Aquest enfocament resulta ideal per enllaços a Punt compartit, intranet o aplicacions web que vulguis deixar a mà a l'escriptori de l'usuari.
PowerShell per a IT: Intune, SCCM i desplegaments a escala
PowerShell incorpora accés al mateix model COM de WSH, de manera que pots crear accessos i distribuir-los massivament. El més habitual és detectar l'escriptori correcte (usuari o públic), generar carpetes de destinació i, si cal, ancorar rutes a Accés ràpid.
# PowerShell: utilidades y creación del acceso
param(
[Parameter(Mandatory=$true)] [string]$ShortcutTargetPath,
[Parameter(Mandatory=$true)] [string]$ShortcutDisplayName,
[string]$IconFile = $null,
[string]$ShortcutArguments = $null,
[string]$WorkingDirectory = $null
)
function Test-RunningAsSystem {
# Devuelve true si el contexto es SYSTEM (S-1-5-18)
((whoami -user) -match "S-1-5-18")
}
function Get-DesktopDir {
if (Test-RunningAsSystem) {
Join-Path $env:PUBLIC "Desktop"
} else {
[Environment]::GetFolderPath("Desktop")
}
}
function New-Shortcut {
param([string]$Target, [string]$Path, [string]$Args, [string]$Work, [string]$Icon)
$sh = New-Object -ComObject WScript.Shell
$lnk = $sh.CreateShortcut($Path)
$lnk.TargetPath = $Target
if ($Args) { $lnk.Arguments = $Args }
if ($Work) { $lnk.WorkingDirectory = $Work }
if ($Icon) { $lnk.IconLocation = $Icon }
$lnk.WindowStyle = 4
$lnk.Save()
[Runtime.InteropServices.Marshal]::ReleaseComObject($sh) | Out-Null
}
$desk = Get-DesktopDir
$targetFolder = Join-Path $desk "SharePoint Shortcuts"
if (-not (Test-Path $targetFolder)) { New-Item -ItemType Directory -Path $targetFolder | Out-Null }
$dest = Join-Path $targetFolder ("{0}.lnk" -f $ShortcutDisplayName)
New-Shortcut -Target $ShortcutTargetPath -Path $dest -Args $ShortcutArguments -Work $WorkingDirectory -Icon $IconFile
En implementacions amb Afinat, aquest patró permet crear una carpeta a l'escriptori i dipositar accessos a Edge amb paràmetres com una URL del SharePoint. Si s'executa com a SYSTEM, lescriptori objectiu serà el públic, visible per a tots els perfils.
En SCCM, si preferiu desplegar un .lnk ja preparat, l'ordre mínima pot ser tan simple com copiar-lo a l'escriptori públic: Copy-Item \\servidor\\ruta\\accés.lnk C:\\Users\\Public\\Desktop. Si no apareix, revisa aquests punts:
- Context d'execució: assegura't que el programa corre amb prou permisos i en l'usuari/sistema esperat.
- Accés al recurs compartit: el compte d'execució ha de poder llegir la ruta UNC.
- Rutes amb espais: tanca -Path i -Destination entre cometes.
- Mordacitat: en entorns mixtos 32/64 bits, confirma que no hi ha redireccions indesitjades.
Ancorar a Accés ràpid amb Shell.Application
A més de l'escriptori, podeu ancorar carpetes a accés ràpid amb l'objecte COM Shell.Application. És útil quan creeu una ruta d'enllaços i voleu que quedi accessible a l'Explorador.
# PowerShell: anclar carpeta a Acceso rápido
$quick = New-Object -ComObject shell.application
$toPin = Join-Path ([Environment]::GetFolderPath("Desktop")) "SharePoint Shortcuts"
$home = "shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}"
if(-not ($quick.Namespace($home).Items() | Where-Object { $_.Path -eq $toPin })){
$quick.Namespace($toPin).Self.InvokeVerb("pintohome")
}
Si administres equips i vols que els usuaris localitzin ràpidament els seus accessos, aquesta petita acció marca la diferència en el seu dia a dia.
MSIX i PSF: crear un accés sense dependre de rutes amb versió
Quan empaquetes aplicacions amb MSIX, la ruta d'instal·lació inclou la versió (per exemple, C:\\Program Files\\WindowsApps\\MiApp_1.0.0.0_x86__…). Canvia amb cada actualització, així que és mala idea fixar un .lnk amb aquesta ruta. Solució: AppExecutionAlias. Definint un àlies al manifest, pots llançar l'app amb %localappdata%\\Microsoft\\WindowsApps\\miapp.exe sense lligar-te a la versió.
Per fer-ho, afegeix els espais de noms al manifest (uap3 i desktop) i crea l'extensió windows.appExecutionAlias apuntant a lexecutable del paquet. Recordeu incloure els noms a IgnorableNamespaces perquè el manifest els reconegui.
Després, podeu canviar el punt d'entrada de l'aplicació a PSFLauncher32.exe/PSFLauncher64.exe (segons arquitectura) i delegar la creació de l'accés en un script d'inici definit a config.json mitjançant PSF. L'script s'executa un cop a la primera inicialització.
{
"applications": [
{
"id": "App",
"executable": "MiApp\\MiApp.exe",
"workingDirectory": "MiApp\\",
"startScript": {
"scriptPath": "createshortcut.ps1",
"runInVirtualEnvironment": false,
"waitForScriptToFinish": true,
"showWindow": false,
"runOnce": true
}
}
]
}
El PowerShell createshortcut.ps1 podeu copiar a l'escriptori de l'usuari un .lnk ja preparat dins del paquet i, a més, portar una icona a l'àrea de LocalCache\\Roaming que roman estable entre versions.
# createshortcut.ps1 (dentro del paquete)
Copy-Item "Mi App.lnk" "$env:USERPROFILE\\Desktop\\Mi App.lnk" -Force
Copy-Item "miapp.ico" "$env:APPDATA\\miapp.ico" -Force
Amb aquest enfocament us assegureu que l'accés funcioni després d'una actualització, sense tocar el .lnk a cada versió. Si l'accés apunta a l'àlies (per exemple, %localappdata%\\Microsoft\\WindowsApps\\miapp.exe), la ruta continuarà sent vàlida.
Control d'errades i validacions recomanades
Abans de generar el .lnk convé validar que el TargetPath existeix (llevat que utilitzeu variables com %windir% o àlies). A VBA/VB6 podeu alertar si l'executable no està o cancel·lar l'operació; a PowerShell, comproveu amb Test-Path si la ruta és accessible.
Si la ruta de la icona és un .ico en xarxa, una tàctica útil és copiar-lo a la carpeta temporal o APPDATA de l'usuari, i referenciar-lo des d'aquí. Així evites icones trencades si el recurs de xarxa no està disponible.
Quan editeu accessos .url, si necessiteu icona pròpia, torneu a obrir el fitxer com a text i afegiu-hi IconFile i IconIndex al final. Això us dóna control total sobre el seu aspecte sense dependre del navegador.
En acabar amb COM, allibera objectes amb ReleaseComObject a PowerShell, o assigna Nothing a VB/VBA. És un detall menor, però ajuda a evitar recursos penjats en execucions intensives.
Casos típics que fallen i com resoldre'ls
Si un desplegament per SCCM finalitza amb codi 0 però l'accés no apareix, revisa primer el usuari objectiu de l'escriptori. Si corria com a SYSTEM i escrius a %USERPROFILE%\\Desktop, no veuràs res al perfil interactiu. Fes servir C:\\Users\\Public\\Desktop per fer-lo visible a tots.
A Intune, quan genereu accessos per a Edge amb arguments (per exemple, una URL amb espais codificats), confirma que les cometes estan bé a -ShortcutArguments i que el text arriba intacte. Un sol espai fora de lloc pot trencar la destinació del .lnk.
Per a carpetes corporatives d'enllaços (p. ex., SharePoint Shortcuts), creeu primer la carpeta a l'escriptori correcte i, si voleu destacar-la a l'Explorador, àncora a Accés ràpid com hem vist amb Shell.Application.
Si distribuïu el .lnk ja construït en un paquet MSIX que s'actualitza, no l'apunteu a la ruta amb versió dins de WindowsApps. Usa AppExecutionAlias i copia la icona fora de la carpeta versionada.
Trucs útils amb variables i rutes
Per escriure scripts portables, recolza't a variables d'entorn: %windir%, %systemroot%, %ProgramFiles% i similars. A WSH pots expandir-les amb ExpandEnvironmentStrings, ia PowerShell t'hi pots referir via $env:VARIABLE.
Quan construïu rutes dinàmiques, comproveu si la carpeta de treball acaba a \ per no duplicar barres ni trencar el TargetPath en concatenar. És un petit guarda-rail que evita errors subtils en producció.
Per a accessos que requereixen paràmetres complexos, considereu escriure un petit script .cmd o .ps1 i que l'accés hi apunti. Així simplifiques el .lnk i controleu millor el quoting i l'ordre d'arguments.
Si necessites tecles ràpides, intenta reservar combinacions amb lletres significatives i evita xocs amb dreceres comunes. En entorns amb moltes apps, documenta les dreceres perquè l'usuari tregui partit sense assaig i error.
Tens un ventall d'opcions per crear accessos a Windows de manera fiable i flexible. WSH és la base comuna, ia sobre pots triar la capa: scripts clàssics, PowerShell modern o empaquetat MSIX amb PSF quan busques processos repetibles a escala. La clau és seleccionar la ruta adequada, validar el context d'execució i no lligar-te a rutes fràgils amb versió.
Redactor apassionat del món dels bytes i la tecnologia en general. M'encanta compartir els meus coneixements a través de l'escriptura, i això és el que faré en aquest bloc, mostrar tot el més interessant sobre gadgets, programari, maquinari, tendències tecnològiques, i més. El meu objectiu és ajudar-te a navegar pel món digital de forma senzilla i entretinguda.