Quando ci si appresta a scrivere uno script in ambiente Windows una delle domande che spesso ci si pone è quella relativa a quale linguaggio di scripting utilizzare.
La domanda è lecita perche come indicato in Windows commands | Microsoft Learn allo stato attuale Windows prevede due shell a riga di comando, ovvero la Command Shell e PowerShell.
La Command Shell è stata la prima shell integrata in Windows per automatizzare le attività di routine tramite file batch (.bat e .cmd). La Command Shell è poi stata estesa tramite Windows Script Host che permette script più soffisticati tramite cscript o wscript.
PowerShell è stato progettato per estendere le funzionalità della Command Shell tramite i cmdlet che forniscono un linguaggio di scripting più estendibile e quindi è raccomando per creare script più robusti.
Batch vs PowerShell
Sebbene si tende a dare per scontato che PowerShell abbia sostituito definitivamente i Batch, in realtà ci sono ancora scenari in cui ha senso valutare uno piuttosto che l’altro.
Infatti in Windows 11 LTSC versione 24H2 troviamo ancora alcuni script .bat e .cmd (come ad esempio winrm.cmd).
Inoltre nel post Rumors of Cmd’s death have been greatly exaggerated – Windows Command Line del 4 Gennaio 2017 Rich Turner (Sr. Program Manager) scriveva:
“The Windows Cmd / Command-Line shell is NOT being removed from Windows in the near or distant future!”
“Also, Cmd != MS-DOS!”
I Batch offrono un linguaggio molto semplice e limitato, ma funziona ovunque sia disponibile cmd.exe e sono particolarmente adatti per task base, ma ha una pipe testuale e non prevede tipizzazione.
Powershell è basato su .NET e utilizza una pipiline ad oggetti e prevede la tipizzazione, supporta logiche complesse, puù utilizzare moduli, librerie, API Windows e API REST, quindi è adatto per automazione avanzata, amministrazione di sistema e scripting complesso.
Quando ha ancora senso usare Batch/DOS?
- Per task semplici che possono agevolmente essere svolti tramite i Windows Command disponibili nella Command Shell o tramite l’avvio di un eseguibile (.exe).
- Scenari di compatibilità con ambienti Windows dove Powershell non è disponibile.
- Quando è richiesta una maggior velocità di esecuzione i batch sono,più rapidi all’avvio e nell’esecuzione se si utilizzano solo i comandi DOS, a riguardo si veda il post di Helge Klein (Microsoft MVP 2011-2018) Performance Footprint of PowerShell Logon Scripts in cui riporta alcune misurazioni secondo cui i batch sarebbero circa 16 volte più performati di uno script PowerShell con un utilizzo della CPU circa 14 volte inferiore consumando circa 1/4 della RAM.
Quando è meglio usare PowerShell?
- Amministrazione di sistema: gestione di Active Directory, servizi, registro di sistema, processi.
- Automazione moderna: chiamate di API REST, elaborazione di JSON/XML/CSV, manipolazione di oggetti complessi.
- Sicurezza e manutenzione: supporto a logging dettagliato, firme digitali, moduli esterni.
- Script portabili e riusabili: consente di organizzare il codice in moduli e funzioni, come un linguaggio di programmazione.
- Necessità di Pipeline potente: PowerShell utilizzail testo grezzo, ma oggetti.
Regola pratica
- Se il task è semplice, immediato e deve poter essere eseguito ovunque utilizzare un Batch.
- Se occorre robustezza, manutenzione e logica complessa utilizzare PowerShell.
Inoltre in base alle considerazioni precedenti se si utilizzano dei Batch non è necessario migrarli in PowerShell a meno che non sia necessario modificarli per supportare nuove funzionalità che potrebbero essere più semplicemente implementate in PowerShell.
Deprecazione di VBscript
Tra i linguaggi di scripting sicuramente possiamo escludere c’è VBScript in quanto è stato deprecato nell’Ottobre 2023, a riguardo si veda Deprecated features in the Windows client | Microsoft Learn:
“VBScript is deprecated. In future releases of Windows, VBScript will be available as a feature on demand before its removal from the operating system.”
Nonostante la deprecazione di VBScript in Windows 11 LTSC versione 24H2 troviamo ancora alcuni script vbs di sistema quali: adsutil.vbs, IIsExt.vbs, prncnfg.vbs, prndrv.vbs, prnjobs.vbs, prnmngr.vbs, prnport.vbs, prnqctl.vbs, slmgr.vbs, SyncAppvPublishingServer.vbs, winrm.vbs. Se proviamo ad utilizzare ad esempio lo script slmgr.vbs per ricavare informazioni sull’attivazione notiamo che funziona, ma questo perché la fase 2 dalla deprecazione ovvero la disabilitazione per default avverrà nel 2027 come indicato in VBScript deprecation: Timelines and next steps | Windows IT Pro Blog:
Phase 1
In the first phase, VBScript FODs will be pre-installed in all Windows 11, version 24H2 and on by default. This helps ensure your experiences are not disrupted if you have a dependency on VBScript while you migrate your dependencies (applications, processes, and the like) away from VBScript. You can see the VBScript FODs enabled by default at Start > Settings > System > Optional featuresPhase 2
Around 2027, the VBScript FODs will no longer be enabled by default. This means that if you still rely on VBScript by that time, you’ll need to enable the FODs to prevent your applications and processes from having problems.Follow these steps if you need to continue using VBScript FODs:
Go to Start > Settings > System > Optional features.
Select View features next to “Add an Optional feature” option at the top.
Type “VBSCRIPT” in the search dialog and select the check box next to the result.
To enable the disabled feature, press Next.Phase 3
VBScript will be retired and eliminated from future versions of Windows. This means all the dynamic link libraries (.dll files) of VBScript will be removed. As a result, projects that rely on VBScript will stop functioning. By then, we expect that you’ll have switched to suggested alternatives.
Quindi se si era abituati ad usare VBScript come linguaggio di script per creare task di automazione in ambiente Windows come indicato in VBScript deprecation: Timelines and next steps | Windows IT Pro Blog occorre valutare di passare a PowerShell oppure utilizzare Javascript:
“Consider two modern solutions to replace VBscript, specifically PowerShell and JavaScript.”
In Windows 11 LTSC versione 24H2 sono presenti anche alcuni script js.
In base alle considerazioni precedenti se si utilizzano dei VBScript è opportuno migrarli in PowerShell, o in JScript, in modo da preparare l’infrastruttura alla fase 2 delle deprecazione di VBScript che stando alle notizie attualmente disponibili dovrebbe avvenire tra circa un anno e mezzo.