Anche oggi sto cercando di impare qualcosa su PowerShell e mi sono "scontrato" con l'uso di comandi.
Ho alcuni script .cmd che uso per eseguire delle attività ripetitive e stavo cercando di tradurli in linee di comando PowerShell.
Ho cercato di trasferire l'uso di comandi con parametri (es. net use * \\server01\share) in variabili e quindi di usare queste variabili per eseguire il comando richiamandole con l'operatore di chiamata di funzioni &.
Ho provato quindi a fare

$command = "net use * \\DC001\images"
& $command
Il risultato non è stato l'attesa esecuzione del comando ma il messaggio di errore:

The term 'net use * \\DC001\images' is not recognized as a cmdlet, function, operable program, or script file. Verify
 the term and try again.
At line:1 char:2
+ &  <<<< $command

Il problema in questo caso è che PowerShell prende tutto il contenuto della variabile come intero comando e non come comando più parametri.
La soluzione è semplice (adesso che l'ho scoperta :) ):

$command = "net"
$parameters = "use","*","\\DC001\images" #ARRAY di parametri
& $command $parameters
Drive Z: is now connected to \\DC001\images.

The command completed successfully

In questo caso PowerShell esegue il comando contenuto in nella variabile $command e gli passa i parametri contenuti nell'array $parameters e tutto funziona regolarmente.
E' da notare come abbia dovuto usare un array di stringhe contenente i diversi parametri e non una stringa con tutti i parametri che sarebbe interpretata come un unico blocco portando ad un errore di esecuzione.
Resta ora il problema di come costruire uno script che accetti parametri e li passi alla linea di comando.
Il pezzo di codice che segue è un esempio, banalissimo, di come come passare dei parametri ad uno script ed eseguire dei comandi dal suo interno:

# Map-share.ps1
# Mappatura di share di rete
# Script di esempio di come passare parametri ad uno script ed eseguire comandi dal suo interno
#
# PierGiorgio Malusardi 2006/12/03

param($share="",$drive="*")
if($share -eq "")
{ Clear-host
  Write-output "ATTENZIONE"
  Write-output "Deve essre indicato lo share di rete da mappare"
  exit
}
# questa parte del codice è eseguita solo se è stato indicato uno share da mappare
$command = "net.exe"
$parameters = "use",$drive,$share
& $command $parameters


La direttiva param(...) deve essere la prima riga dello script, esclusi commenti (linee precedute da #) e linee bianche.
I paramentri devo essere indicati nell'ordine con cui saranno passati sulla linea di comando e possono essere inizializzati con un parametro di default.

Alcuni miglioramenti che si possono fare allo script sono:
- verificare che il disco su cui mappare lo share non sia già in uso
- verificare che la stringa che indica lo share da mappare sia formalmente corretta

Adesso voglio fare un altro paio di esperimenti (più o meno banali come questo).
Se mi riescono vi riporterò i risultati, se no passerò tutto dignitosamente sotto silenzio

Ciao

PierGiorgio Malusardi