Crea dreceres personalitzades amb Windows Script Host

Darrera actualització: 29/09/2025
Autor: Isaac
  • 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.

Accessos directes a Windows amb WSH

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.

Exemples d'scripts per a dreceres

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.

  Com transmetre vídeos en xarxa amb VLC fàcilment

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.

  Learn how to Cease Others From Controlling Your Chromecast Machine

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.

  Com utilitzar FaceTime al teu PC amb Windows

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ó.