2010-05-30 3 views
1

J'ai besoin d'exécuter des scriptsblocs/scripts à partir du shell de niveau supérieur actuel et je veux qu'ils laissent l'intégralité de la portée non modifiée.Comment empêcher une commande/un script de changer d'environnement global

Jusqu'à présent, je n'ai pu penser aux possibilités suivantes:

powershell -file <script> 
powershell -noprofile -command <scriptblock> 

Le problème est qu'ils sont très lents.

Par exemple, je voudrais être en mesure de le faire:

mkdir newdir 
cd newdir 
$env:NEW_VAR = 100 
ni -item f 'newfile.txt' 

... pour que le répertoire de travail de ma coquille ne changerait pas et $env:NEW_VAR ne serait pas défini dans la portée globale.

Existe-t-il d'autres alternatives pour y parvenir?

Répondre

1

Il n'existe pas d'environnement global. Lors de la création d'un nouveau processus, le système d'exploitation crée une copie de l'environnement pour le nouveau processus.

Si vous exécutez les scripts dans un processus séparé, quand il laisse tout sera intact.

+2

Je pense que je voulais dire « portée », et non « environnement ». – guillermooo

2

Je ne connais pas d'autre alternative. Les variables d'environnement sont conservées par processus lorsque @Peter a répondu. De plus, si vous créez un nouveau répertoire et un fichier, vous modifiez l'environnement global. Donc le script n'est pas complètement innocent.

Dans votre cas, je voudrais lancer un nouveau processus comme vous l'avez suggéré.
S'il est trop paresseux, placez-le dans un script et l'envelopper dans try/finally:

--- script.ps1 
push-location 
try { 
    mkdir newdir 
    cd newdir 
    $env:NEW_VAR = 100 
    ni -item f 'newfile.txt' 
} finally { 
    pop-location 
    # delete dir/file? 
    remove-item env:NEW_VAR 
} 
Questions connexes