2016-05-11 6 views
5

A volte quando sto scrivendo uno script sul mio Windows 10 Machine (PowerShell 5.0) utilizzo comandi, parametri o alias che non sono disponibili nelle versioni precedenti di PowerShell, ad esempio il parametro -persist di new-psdrive non è disponibile su PowerShell 2.0, il tutto delle nostre macchine Win7.Posso controllare quale versione ha bisogno del mio script PS?

per impostare correttamente l'istruzione #requires -version x, ho bisogno di sapere se ci sono comandi nel mio script che non sono disponibili per versioni precedenti di PowerShell. Quando hai scritto un codice con 1000 righe, potrebbe essere un po 'difficile trovare comandi non disponibili nel tuo script.

C'è un modo per controllare questo a livello di codice, oltre a eseguire lo script in diversi ambienti PowerShell e vedere cosa sta succedendo?

+0

Sarebbe piuttosto difficile; per esempio. confronta '$ a = @ ('ab', 'bc'); $ a.Replace ('b', '') 'su PSv4 e PSv2 ('a', 'c') vs messaggio di errore. Eppure '$ a.Replace ('b', '')' è ancora una cosa valida da fare in PSv2. Se '$ a = Ottieni-Qualunque' da un modulo, come potrebbe sapere se il tuo Sostituire era valido o non valido? – TessellatingHeckler

+1

Windows 7 Service Pack 1 può essere "esaminato" fino a Powershell 5.0. Mi piacerebbe solo mordere il proiettile e aggiornare tutto. –

risposta

0

Abbiamo deciso di realizzare la linea di base Powershell v.4 per tutti i sistemi. Così ho scritto uno script PowerShell per garantire che v.4 sia installato su tutti i sistemi. È impostato per essere eseguito tramite lo script di arresto GPO sotto configurazione macchina.

IF ($PSVersionTable.PSVersion.Major -like "4*"){$StringToWrite | Out-File -FilePath $Logpath\PwrShl\Powershell_UpToDate_$hostname.log -Append; IF (Test-Path -Path $Logpath\PwrShl\Powershell_OutofDate_$hostname.log){Remove-Item $Logpath\PwrShl\Powershell_OutofDate_$hostname.log -Force}; exit} 
IF (($PSVersionTable.PSVersion.Major -like "2*") -or ($PSVersionTable.PSVersion.Major -like "3*")){$StringToWrite | Out-File -FilePath $Logpath\PwrShl\Powershell_OutofDate_$hostname.log -Append} 

if ($env:PROCESSOR_ARCHITECTURE -eq "x86"){ 
if (!(Test-Path C:\SchTsk\Temp\Windows6.1-KB2819745-x86-MultiPkg.msu)){Copy-Item "\\ad.dcpds.cpms.osd.mil\SYSVOL\ad.dcpds.cpms.osd.mil\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Scripts\Startup\Windows6.1-KB2819745-x86-MultiPkg.msu" -Destination C:\SchTsk\Temp\Windows6.1-KB2819745-x86-MultiPkg.msu -Force} 
} 
if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64"){ 
if (!(Test-Path C:\SchTsk\Temp\Windows6.1-KB2819745-x64-MultiPkg.msu)){Copy-Item "\\ad.dcpds.cpms.osd.mil\SYSVOL\ad.dcpds.cpms.osd.mil\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Scripts\Startup\Windows6.1-KB2819745-x64-MultiPkg.msu" -Destination C:\SchTsk\Temp\Windows6.1-KB2819745-x64-MultiPkg.msu -Force} 
} 

IF ($env:PROCESSOR_ARCHITECTURE -eq "x86"){ 
    Set-Location C:\SchTsk\Temp 
    if (!(Test-Path C:\SchTsk\Temp\Windows6.1-KB2819745-x86-MultiPkg.msu)){exit} 
    expand -F:* .\Windows6.1-KB2819745-x86-MultiPkg.msu C:\SchTsk\Temp 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2872035-x86.cab /NoRestart' -Wait 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2872047-x86.cab /NoRestart' -Wait 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2819745-x86.cab /NoRestart' -Wait 
    } 
IF ($env:PROCESSOR_ARCHITECTURE -eq "amd64"){ 
    Set-Location C:\SchTsk\Temp 
    if (!(Test-Path C:\SchTsk\Temp\Windows6.1-KB2819745-x64-MultiPkg.msu)){exit} 
    expand -F:* .\Windows6.1-KB2819745-x64-MultiPkg.msu C:\SchTsk\Temp 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2809215-x64.cab /NoRestart' -Wait 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2872035-x64.cab /NoRestart' -Wait 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2872047-x64.cab /NoRestart' -Wait 
    Start-Process dism.exe -ArgumentList '/online /add-package /PackagePath:C:\SchTsk\Temp\Windows6.1-KB2819745-x64.cab /NoRestart' -Wait 
    } 

sono la velocità di rete è una specie di crapy e ho avuto problemi con esso cercando di continuare a circolare e il file non sia inesistente. Così ho semplicemente avuto l'uscita se il file non è lì per estrarre e installare. Dal momento che richiede un riavvio, lo script di arresto ha reso il massimo da allora. Questo è stato un bel successo per me, ha avuto qualche bambino problematico.

1

Hai considerato lo sviluppo sul tuo computer Windows 10 ma hai impostato il tuo profilo PowerShell per eseguire sempre un PowerShell - versione 2?

Avvierai PowerShell che avvierà la versione 2 per lo sviluppo e se ci sono errori nello script saprai quando saranno creati e comandi che verrebbero eseguiti nella versione 5 (o in qualsiasi versione della tua macchina Win10) fallirebbe.

Si deve notare che il lancio PowerShell come questo:
PowerShell -version 2 manterrà la logica lo stesso e agire come il PowerShell versione 2, ma il file di aiuto e di uscita dal Commmands Get-Help sarà ancora mostrare la versione 5 (o qualsiasi altra cosa) sintassi che è la vera versione di PowerShell.

Impostazione del proprio profilo PowerShell:
http://www.howtogeek.com/50236/customizing-your-powershell-profile/

È possibile controllare la versione in esecuzione con $ PSVersionTable