Questa discussione riguarda piuttosto un aspetto della shell dei comandi di Windows che PowerShell direttamente, ma credo sia interessante per un confronto su come vengano gestite le variabili di sistema dai diversi ambienti di scripting.
Mi ricollego al mio post precedente intitolato "Assegnare ad una variabile la lettera di un volume logico"
http://www.powershell.it/Forum/Generale/Thread/2d1e564b70964924bf4545ea982f88b4/Assegnare-ad-una-variabile-la-lettera-di-un-volume-logico.aspx in cui discutevamo su come ricercare la lettera di unità assegnata automaticamente ad un dispositivo di storage esterno che viene collegato al sistema, ad esempio un disco usb o un pendrive, in base ad una label preimpostata, o come suggerito da Efran, in base al DeviceId assegnato alla periferica da Windows.
A completamento vorrei rendere disponibile questa informazione in modo permanente, cosicché il riferimento possa essere utilizzato da altre procedure, ad esempio degli script di backup.
Ho pensato dunque di creare una nuova variabile di ambiente a livello di sistema tramite .Net Framework. con il metodo
[Environment]::SetEnvironmentVariable
Supponendo che la periferica da monitorare abbia impostata come etichetta di volume "STORE'N'GO" (trattasi di un pendrive della Verbatim), lo script potrebbe essere il seguente:
$DeviceId = (
Get-WmiObject -class Win32_LogicalDisk |
Where-Object {$_.VolumeName -match "STORE"}
).DeviceID
[Environment]::SetEnvironmentVariable("BackupDrive",$DeviceId,"Machine")
Viene dunque creata una variabile di ambiente denominata "BackupDrive", contentente la lettera del drive esterno collegato.
Fin qui tutto bene
Il problema nasce nel momento in cui dobbiamo fare riferimento alla variabile. A titolo di esempio ho provato ad impostare un job schedulato di NTBackup indicando esplicitamente, come percorso di destinazione del backup, il drive in questione. Una volta creato il job, ho modificato la stringa sostituendo alla lettera del drive impostato, la variabile precedentemente creata.
La destinazione del backup nello script di NTBackup cambia da
.../f "F:\BackupFolder\BackupNormale.bkf"
a
.../f "%BackupDrive%:\BackupFolder\BackupNormale.bkf"
Se proviamo ad avviare il job ci accorgiamo che la procedura termina in modo istantaneo: nel registro di log vediamo che il motivo è che il percorso di destinazione non è valido. Copiando lo script all'interno di un file batch e aggiungendo il comando pause di seguito, andiamo ad analizzare cosa succede: effettivamente ciò che è scritto nel log è vero, in quanto al posto la variabile
BackupDrive non viene sostituita con il corretto valore. Tuttavia aprendo una shell dei comandi e copiando dentro esattamente la stessa stringa del job, la variabile viene correttamente sostituita ed il backup va a buon fine. Evidentemente quando apriamo manualmente la shell dei comandi, la variabile viene risolta correttamente, nell'altro caso no.
--- Nota: mi piacerebbe corredare la discussione con qualche immagine ma non so come inserirla ---
Ad ulteriore prova ho provato a vedere cosa succede con le variabili ambiente preimpostate. Eseguendo un file batch che contiente un riferimento ad una variabile ambiente preimpostata, ad esempio
PATH, questa viene correttamente sostituita. Non accade la stessa cosa con la variabile di ambiente da me creata.
Mi chiedo: che differenza c'è tra le due variabili? Forse la variabile deve essere registrata in qualche file di configurazione?