Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Il comando di esempio che propongo come soluzione è questo:
powershell -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" -Command "$p = Start-Process cmd.exe -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' -Verb RunAs -Wait -PassThru; exit $p.ExitCode"

Leggi tutto: Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Scenario: ho un file bat che deve eseguire delle operazioni con privilegi elevati (nel mio caso specifico, giusto per dare un esempio: registrare una DLL che rappresenta un Add-in del CAD SolidWorks) e – se non trovati – auto-invocarsi dopo aver chiesto le credenziali di amministratore, attendere che la “propria copia” eseguita nel “cmd.exe” appositamente creato faccia il suo lavoro e termini con un codice di uscita, il quale, deve poi essere catturato dal processo iniziale e gestito.

Lo so, scritta così, è un po’ “arzigogolata” la cosa; una AI la scriverebbe così:

Ho un file batch che deve eseguire operazioni con privilegi elevati (ad esempio, registrare una DLL che funge da add‑in per SolidWorks). Se la DLL non è presente, il batch deve:

  1. Richiedere le credenziali di amministratore.
  2. Ri‑eseguire se stesso in una nuova istanza di cmd.exe con i privilegi ottenuti.
  3. Attendere che la copia “eseguita” completi il lavoro e termini con un codice di uscita.
  4. Catturare quel codice di uscita nella sessione originale e gestirlo di conseguenza.

Forse sono io che ho posto male la domanda all’AI quando gli ho chiesto di realizzare la cosa ma, avendo tribolato molto per ottenere un risultato funzionante, magari l’esempio sopra può servire a qualche disperato come me.

Per quanto riguarda il comando di esempio, espongo la relativa descrizione (sempre fatta da AI):

Spiegazione dettagliata del comando

powershell `
  -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" `
  -Command "$p = Start-Process cmd.exe `
              -ArgumentList '/c', `
                           'C:\percorso\raggiungibile\da\admin\script.bat', `
                           '/comando1', `
                           '\"C:\un percorso con spazi\giusto\di\esempio\"', `
                           'PARAMETRO3' `
              -Verb RunAs `
              -Wait `
              -PassThru; `
          exit $p.ExitCode"

1. powershell – avvio di PowerShell

Il comando è eseguito da un prompt di comando (cmd.exe) o da un altro script batch.
powershell lancia una nuova istanza di PowerShell in modalità interattiva (o in modalità script, a seconda del contesto).


2. -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin"

Imposta la cartella di lavoro corrente della sessione PowerShell.
Tutto ciò che viene eseguito all’interno di PowerShell (ad esempio i file batch o i comandi) verrà cercato in questa directory se non viene specificato un percorso assoluto.


3. -Command "<script>"

Il parametro -Command indica a PowerShell di eseguire immediatamente la stringa di script che segue.
La stringa è racchiusa tra virgolette doppie ("), quindi è interpretata come un unico argomento per PowerShell.


4. $p = Start-Process cmd.exe ...

a. $p =

La variabile $p conterrà l’oggetto Process restituito da Start-Process.
Questo oggetto fornisce, tra le altre cose, la proprietà ExitCode che verrà usata alla fine.

b. Start-Process cmd.exe

Avvia un nuovo processo cmd.exe.
Questo è il motivo per cui il comando è avvolto in PowerShell: Start-Process è un cmdlet nativo di PowerShell, non di cmd.exe.

c. -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3'

-ArgumentList specifica gli argomenti che verranno passati a cmd.exe.

  • '/c' dice a cmd.exe di eseguire il comando che segue e poi chiudersi.
  • 'C:\percorso\raggiungibile\da\admin\script.bat' è il file batch da eseguire.
  • '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' sono gli argomenti che il batch riceverà.
  • L’argomento con spazi è racchiuso tra virgolette doppie (\"...\") per garantire che venga passato come un singolo parametro a cmd.exe.
  • Le virgolette doppie sono escape (\") perché la stringa è già racchiusa tra virgolette doppie di PowerShell.

d. -Verb RunAs

Chiede a Windows di eseguire il processo con privilegi elevati (prompt UAC).
Se l’utente non è già amministratore, verrà mostrata la finestra di dialogo “Richiesta di credenziali”.

e. -Wait

Il comando PowerShell attende che il processo cmd.exe termini prima di continuare.
Ciò garantisce che il batch abbia finito di lavorare prima di procedere.

f. -PassThru

Restituisce l’oggetto Process (che viene assegnato a $p).
Se non fosse presente, $p sarebbe null e non si potrebbe leggere ExitCode.


5. exit $p.ExitCode

Dopo che cmd.exe è terminato, PowerShell esce con lo stesso codice di uscita del processo avviato.
Questo è fondamentale se il batch viene chiamato da un altro script o da un sistema di automazione: il valore di ritorno indica se l’operazione è andata a buon fine o se è stato riscontrato un errore.


Riepilogo in un unico flusso

  1. PowerShell viene lanciata con una cartella di lavoro specificata.
  2. All’interno di PowerShell, si avvia cmd.exe con:
    • cmd.exe /c script.bat … (il batch e i suoi argomenti)
    • privilegi elevati (RunAs)
    • attesa della terminazione (-Wait)
    • restituzione dell’oggetto processo (-PassThru)
  3. Una volta terminato il batch, PowerShell termina con lo stesso codice di uscita del batch.

VBS: Creare Collegamento Windows (Shortcut) in Visual Basic

Incollo qui il sorgente di un Visual Basic Script per Windows che consente di creare sul Desktop di Windows un collegamento.

Può essere lanciato da DOS, quindi, da un comune file batch. Richiede 8 parametri, ovvero:

  1. Nome del Link (cioè del file .lnk)
  2. Target (cioè il programma da lanciare)
  3. Argomenti (da passare al Target, facoltativi)
  4. Working Directory (la cartella dalla quale lanciare il Target)
  5. Descrizione del Link
  6. Combinazione Tasti Scelta Rapida (facoltativa)
  7. Icona
  8. Codice Stile Finestra che può avere 3 valori: 1, 2 e 3

Con il valore “1”, in stile finestra, si ottiene la memorizzazione dello stato della finestra, con 2 è massimizzata e con 3 minimizzata ad icona.

Questo il sorgente del file che io ho chiamato “make_windows_link.vbs”:

'********************************************************************************
' UDA'Software 2018
' VERSIONE 2018-11-19
'
' QUESTO SCRIPT HA LO SCOPO DI CREARE UN LINK WINDOWS PER L'AVVIO DI UN
' PROGRAMMA.
'
' PER FUNZIONARE NECESSITA CHE VENGANO SPECIFICATI, IN PRECISO ORDINE, I SEGUENTI
' PARAMETRI:
'
' 1) NOME DEL LINK (SENZA ESTENSIONE, VIENE AGGIUNTA IN AUTOMATICO)
' 2) TARGET
' 3) ARGOMENTI
' 4) WORKING DIRECTORY (Directory di lancio)
' 5) DESCRIZIONE LINK
' 6) COMBINAZIONE TASTI SCELTA RAPIDA
' 7) ICONA
' 8) CODICE STILE FINESTRA (DESCRIZIONE FORNITA DA Microsoft):
' 
'    1 - activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position.
'    3 - Activates the window and displays it as a maximized window.
'    7 - Minimizes the window and activates the next top-level window.
' 
' 9) PERCORSO DOVE CREARE IL LINK (EX: %PUBLIC%\Desktop )
'
' ESEMPIO:
'
' make_windows_link.vbs "Link Guida Windows" "C:\Windows\winhlp32.exe" "" "C:\Windows" "Lancio della Guida" "CTRL+ALT+SHIFT+H" "C:\Windows\winhlp32.exe" 1
' make_windows_link.vbs "Link Guida Windows" "C:\Windows\winhlp32.exe" "" "C:\Windows" "Lancio della Guida" "CTRL+ALT+SHIFT+H" "C:\Windows\winhlp32.exe" 1 "%PUBLIC%\Desktop"
'
'********************************************************************************
Dim sLinkName 			' 0 Nome del Link
Dim sTargetPath			' 1 Target del link
Dim sArguments			' 2 Argomenti del target
Dim sWorkingDirectory	' 3 Working Directory
Dim sDescription		' 4 Descrizione del Link
Dim sHotKey				' 5 Combinazione Tasti Scelta Rapida
Dim sIconLocation		' 6 Icona da utilizzare
Dim iWindowStyle 		' 7 Stile Finestra

'********************************************************************************
iExitCode = 1	' PER DEFAULT IL CODICE DI USCITA E' ERRORE GENERICO

Set args = WScript.Arguments

If args.Count < 8 Then
	MsgBox "Procedura invocata senza gli 8 parametri previsi.", vbOKOnly & vbCritical, "ERRORE"
	wscript.Quit(iExitCode)
End If

' Associazione parametri
sLinkName = args.Item(0)
sTargetPath = args.Item(1)
sArguments = args.Item(2)
sWorkingDirectory = args.Item(3)
sDescription = args.Item(4)
sHotKey = args.Item(5)
sIconLocation = args.Item(6)
iWindowStyle = args.Item(7)

'********************************************************************************
Set oShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

'********************************************************************************
sDesktopPath = oShell.SpecialFolders("Desktop")

If args.Count >= 9 Then
	sDesktopPath = args.Item(8)
	
	If Not fso.FolderExists(sDesktopPath) Then
		Debug.Write "Cartella " + sDesktopPath + " inesistente"
		iExitCode = 3
		WScript.Quit(iExitCode)
	End If
End If

'********************************************************************************
Set oLink = oShell.CreateShortcut(sDesktopPath + "\\" + sLinkName + ".lnk")
oLink.TargetPath = sTargetPath
oLink.Arguments = sArguments
oLink.WorkingDirectory = sWorkingDirectory
oLink.Description = sDescription
oLink.HotKey = sHotKey
oLink.IconLocation = sIconLocation
oLink.WindowStyle = iWindowStyle
oLink.Save()

'********************************************************************************
If fso.FileExists(sDesktopPath + "\\" + sLinkName + ".lnk") Then
	iExitCode = 0
Else
	iExitCode = 2
End If

'********************************************************************************
' USCITA
' CODICI DI USCITA: 0 = OK / 1 = ERRORE ARGOMENTI / 2 = ERRORE FILE
WScript.Quit(iExitCode)
'********************************************************************************

Va preso e copiato dentro un file con estensione “.vbs” (ex: make_windows_link.vbs ); lo si può creare anche con Blocco Note o qualsiasi altro editor di testo ASCII.

Per usarlo lo si può lanciare da un file batch (.bat) o qualsiasi altra cosa possa eseguire comandi del sistema operativo; a titolo di esempio incollo un file batch che lo lancia e che ci si può personalizzare sostituendo i vari “%1”, “%2”, ecc… con quello che si vuole:

@echo OFF
title Creazione Icona %5
rem %1 : Nome del Link
rem %2 : Target
rem %3 : Parametri
rem %4 : Cartella Partenza
rem %5 : Descrizione
rem %6 : Hotkey
rem %7 : Icona
ECHO Creazione Icona %5
make_windows_link.vbs" %1 %2 %3 %4 %5 %6 %7 3 %8
IF NOT "%ERRORLEVEL%"=="0" (
	ECHO ********************************************************************************
	ECHO ATTENZIONE: NON RISULTA POSSIBILE CREARE L'ICONA: 
	ECHO             %5
	ECHO.
	ECHO PARAMETRI:
	ECHO.
	ECHO 1 : %1
	ECHO 2 : %2
	ECHO 3 : %3
	ECHO 4 : %4
	ECHO 5 : %5
	ECHO 6 : %6
	ECHO 7 : %7
	ECHO 8 : %8
	ECHO.
	ECHO ********************************************************************************
)

Convertire registrazione video fatta con Decoder Digitale Dicra (RICEVITORE DVB-T STB PVR) su iMac

Ho questa necessità: Registrare su penna USB un programma televisivo, tramite un Decoder Digitale Dicra (RICEVITORE DVB-T STB PVR), e convertirlo in modo che il risultato sia leggibile collegando la medesima penna USB ad un televisore che supporta la riproduzione di files multimediali (in genere AVI e MPG sono formati supportati); il tutto su MAC OS X (iMac).

Leggi tutto “Convertire registrazione video fatta con Decoder Digitale Dicra (RICEVITORE DVB-T STB PVR) su iMac”

Mac OS X: Creare una propria cartella per gli Script Bash

Mi capita spesso la necessità di crearmi degli Script Bash con i quali svolgere operazioni ripetitive.

Si tratta di programmi che vengono interpretati run-time ed eseguiti; in altri termini: il sistema operativo apre il file sorgente dello script, lo interpreta e lo esegue.

N.B.: Solo per conoscenza sottolineo come, solitamente, i programmi (o Applicazioni, come ultimamente vengono chiamate), si trovano in una forma che il sistema non deve interpretare, sono già direttamente eseguibili (contengono, appunto, le istruzioni in codice macchina per il proprio sistema operativo/hardware e sono conosciuti come file binari); tuttavia, prima di essere dei file binari, erano dei file sorgenti (cioè il codice scritto in un qualche Linguaggio di Programmazione – come ad esempio C, C++, C#, Visual Basic e molti altri – da un utente programmatore) che sono stati trasformati attraverso un’operazione detta di compilazione (in sintesi: un codice sorgente scritto con un linguaggio di programmazione viene compilato per creare un codice binario eseguibile).

Le comodità di creare uno Script Bash sono molteplici:

Leggi tutto “Mac OS X: Creare una propria cartella per gli Script Bash”

Cambiare data alle foto con iMac

Ho già creato il medesimo articolo dedicato a Linux ma, essendo lo script che esegue l’operazione, piuttosto diverso nella versione iMac ho, per praticità, preferito crearlo ex-novo.

Il problema: cambiare la data ad un insieme di foto (ma, volendo, a qualsiasi file) con uno strumento sufficientemente potente, che mi consenta di stabilire se eseguire addizioni/sottrazioni alle date, piuttosto che impostare la data odierna o comunque una forzata.

Leggi tutto “Cambiare data alle foto con iMac”

Pro/Engineer: Creare file postscript automaticamente delle messe in tavola (DRW)

Dovendo creare il file postscript (che in genere converto poi in PDF, tramite apposito script) delle messe in tavola presenti in una determinata cartella, ho realizzato uno Script Bash (da utilizzare con MSYS ) che automatizza la cosa, andando a creare un file TRAIL per Pro/Engineer.

Leggi tutto “Pro/Engineer: Creare file postscript automaticamente delle messe in tavola (DRW)”

Pro/Engineer: Individuare dove è montato un componente in base al codice dentro gli assembly

Ho realizzato uno Bash Script il cui scopo è quello, fornendo il codice di un componente, individuare in quali assiemi è montato e mostrare le dipendenze degli stessi.

Leggi tutto “Pro/Engineer: Individuare dove è montato un componente in base al codice dentro gli assembly”

Pro/Engineer: Individuare le dipendenze di un file DRW (messa in tavola)

Ho realizzato uno script bash (gli utenti Windows possono utilizzarlo tramite MSYS ) che consente di verificare, per ogni file DRW (le messe in tavola) contenuto nella medesima cartella dove si esegue il comando, se sono presenti tutte le dipendenze che servono per aprirlo (cioè i file PRT e ASM).

Leggi tutto “Pro/Engineer: Individuare le dipendenze di un file DRW (messa in tavola)”

Gnome Nautilus: Aggiungere comandi personalizzati al menu contestuale

Desideravo fare in modo che, cliccando con il tasto destro del mouse sopra un file – con il file manager di Gnome “Nautilus” – mi venisse offerta la possibilità di crearne il codice md5sum (quello utilizzato per verificare l’originalità di un file), magari salvandolo in un apposito file, con estensione .md5 e nome uguale a quello di origine.

Leggi tutto “Gnome Nautilus: Aggiungere comandi personalizzati al menu contestuale”

Eseguire Script all’Avvio e/o alla Chiusura di Windows

Mi è capitata la necessità di eseguire un programma nel momento in cui Windows si deve chiudere. Ho indagato e ho scoperto esistere un sistema piuttosto pratico e che funziona su diverse versioni, direi a partire da Windows 2000 o sicuramente da Windows XP.

Leggi tutto “Eseguire Script all’Avvio e/o alla Chiusura di Windows”