J'espère que le titre est concis, mais juste au cas où: p>
J'appelle un script PowerShell à partir d'un fichier de lot. Je souhaite que le script PowerShell définit la valeur d'une variable d'environnement et pour cette nouvelle valeur disponible dans le fichier de commandes lorsque le script PowerShell se termine. P>
Je sais qu'il est possible de définir une variable d'environnement en utilisant $ ENV dans PowerShell, mais la valeur ne persiste pas lorsque le script PowerShell se termine. J'imagine que c'est probablement parce que PowerShell est exécuté dans un processus séparé. P>
Je suis conscient que je peux retourner un code de sortie et utiliser% errorLel%, mais cela ne me donnera que des chiffres, et il y aura un conflit, car 1 indique une exception PowerShell plutôt qu'un nombre utile. P>
Maintenant, voici la mise en garde: je ne veux pas que la variable d'environnement persiste. C'est-à-dire que je ne veux pas que cela soit défini pour l'utilisateur ou le système, et je souhaite donc qu'il soit indisponible dès que le fichier de lot est sorti. En fin de compte, je souhaite simplement communiquer les résultats à partir d'un script PowerShell au fichier de commandes appelant. P>
est-ce possible? P>
Merci d'avance :) P>
Nick P>
3 Réponses :
Le moyen le plus simple de capturer les résultats de Powershell est d'utiliser stdout dans PowerShell. Par exemple, cela permet d'économiser la date au d env Var dans cmd.exe
Belle solution. Je doute qu'il y ait une autre qui est si facile et simple.
Merci pour la réponse, mais je ne pense pas que ce qui précède fonctionnera? Ce que je pouvais m'attendre à ce que j'arrive dans ce cas est que la valeur de la variable d'environnement "D" sera "PowerShell -Noprofile" & {get-date} "'. IE: Le contenu du côté droit de l'expression n'est pas évalué.
@Nicholas, tu as raison. Je l'ai essayé maintenant et il n'y a vraiment que des chaînes stockées dans la variable.
Doh! Si seulement cmd était aussi simple que PowerShell. Bonne chose @zdan a la CMD.exe Coffre Cuz Cuz la seule chose que j'ai jamais utilisée cmd.exe pour était exécutant des utilitaires de ligne de commande et des fichiers de lots d'autres personnes. :-)
Une fois que vous avez obtenu les aléas de la commande "for" vers le bas, CMD peut réellement devenir utile (bien que si seulement si PowerShell n'est pas disponible).
Pour obtenir l'idée de Keith d'utiliser STDOUT pour fonctionner, vous pouvez appeler PowerShell à partir de votre script de lot comme celui-ci: Un peu maladroit, mais cela fonctionne: P> C:\>FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"
C:\>set d
d=August 5, 2010 11:04:36 AM
De plus, si vous exécutez ce code dans un fichier de commandes et non de la ligne de commande, vous devez utiliser des panneaux de double pour cent devant votre nom de variable (c.-à-d. Modifier% V à %% V dans les deux endroits de l'exemple ci-dessus) .
Si vous voulez plus de détails, vous pouvez les voir sur blogs.msdn. Microsoft.com/oldnewthing/20120731-00/?p=7003
Je sais que c'est un peu en retard pour répondre à cette question, mais je voudrais essayer d'essayer au cas où une solution plus détaillée nécessite une solution plus détaillée. Donc, voilà ici.
J'ai créé une fonction de lot qui exécuterait un script PS pour vous et retournerait une valeur, quelque chose comme ceci: p> maintenant, comme exemple Pour l'utiliser: P> set Workstation=MyVMName
call :CheckMachineUpOrDown VMStatus %Workstation%
echo %VMStatus%