Perché PowerShell ISE non isola le variabili di script nell'ambito di script?


12

In PowerShell, l'ambito dovrebbe impedire agli oggetti (variabili, alias, funzioni, ecc.) Negli script di influire sull'ambiente globale. Questo sembra funzionare bene nella riga di comando, ma non nell'ISE.

Ecco una dimostrazione nella console. Controllo per vedere che $xnon è definito nell'ambito globale, mostrare il contenuto ScopeTest.ps1e quindi eseguirlo, e infine controllo per vedere se $xè definito di nuovo. Come previsto, $xviene creato e utilizzato solo nell'ambito dello script e non persiste nell'ambiente globale dopo la fine dello script.

inserisci qui la descrizione dell'immagine

In ISE, questo sembra funzionare se lo script viene chiamato utilizzando la finestra della console.

inserisci qui la descrizione dell'immagine

Tuttavia, se effettivamente utilizzo il pulsante "Esegui script" o F5, le variabili all'interno dello script persisteranno dopo il completamento.

inserisci qui la descrizione dell'immagine

Ciò può rendere un po 'difficile la scrittura e la risoluzione degli script, se lo script presuppone che verrà avviato da un ambiente pulito (ad esempio: eventuali variabili impostate all'interno dello script non dovrebbero già esistere). Perché l'ISE si comporta in questo modo?

Una risposta a questa domanda tocca leggermente l'argomento, menzionando "dot-sourcing", ma spero di ottenere una spiegazione più approfondita qui. Inoltre, se esiste una documentazione sul perché lo script viene eseguito in modo diverso nell'ISE rispetto alla console, anche un riferimento sarebbe utile.

Risposte:


9

Negli esempi di script hai creato variabili e non le hai distrutte alla fine dello script. ISE crea un'istanza live di PowerShell che carica ed esegue lo script quando si fa clic su Esegui. La differenza è che la shell integrata può continuare lo script. Questo è l'ideale per il debug dell'ambiente e per la creazione di script mentre procedi. In questo modo non è necessario continuare a eseguire lo script più volte (ci sono situazioni in cui questo non sarebbe l'ideale) per assicurarsi che la riga successiva di codice funzionasse. Lo digiti nella shell e, se funziona, lo aggiungi alla sezione script.

Questo comportamento è forse meglio descritto qui: http://technet.microsoft.com/en-us/library/dd819480.aspx

Estratto pertinente:

Tutti i riquadri in ISE sono sempre nello stesso ambito.

Se non vuoi che le tue variabili vivano nella shell dopo che lo script è stato completato, dovresti farlo Remove-Variable.

Per esempio:

Remove-Variable x

È possibile aggiungere un'istanza "pulita" di PowerShell all'ISE facendo clic su File-> Nuova scheda Powershell


2

In ISE Powershell sta essenzialmente scaricando lo script sulla shell e quindi eseguendolo. Come se lo avessi digitato nella shell, quindi eseguito. Quindi la variabile è disponibile per quella sessione. Per vedere altre differenze, dai un'occhiata a questo post MSDN .


Non vedo nulla nel post collegato che affronti questo comportamento.
Iszi,

0

quindi l'ISE è Scoped come globale. A meno che non si rimuovano tutte le variabili create mentre si lavora in ISE, tutte le variabili saranno disponibili dopo l'esecuzione dello script. Quando utilizzo ISE per creare il mio script, eseguirò sempre il test con una console PowerShell diversa aperta. Questo mi permette di assicurarmi che tutto funzioni come previsto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.