63 votes

Invite de commande Windows : comment obtenir la sortie d'une commande dans une variable d'environnement ?

Je veux avoir une variable d'environnement qui contient le jour de la semaine dans cmd.exe.

Lorsque j'exécute cette commande, j'obtiens le résultat que je souhaite.

C:\Users\tisc> powershell (get-date).dayofweek
Friday

Ici, j'essaie de stocker le résultat dans une variable d'environnement.

C:\Users\tisc> set dow = powershell (get-date).dayofweek

Mais quand j'essaie de l'obtenir, je n'obtiens pas la chaîne que je voulais.

C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek

Mon objectif est d'utiliser la variable dans un fichier batch pour certains scripts de sauvegarde.

92voto

umpirsky Points 2922

Vous pouvez utiliser quelque chose comme :

$env:DOW = "foo"

3 votes

Je ne comprends pas pourquoi cela a été signalé négativement, connaissez-vous une meilleure façon de définir les variables d'environnement ?

2 votes

+1 Cela fonctionne très bien pour moi dans le scénario dont j'avais besoin. PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')

14 votes

@IonTodirel Parce que cela ne persiste que dans l'espace du processus.

23voto

Dan Points 15190

Vous devriez exécuter les deux commandes dans PowerShell, car PowerShell est plus que capable de manipuler les variables d'environnement.

C'est-à-dire :

$dow = (get-date).dayofweek
[Environment]::SetEnvironmentVariable("DOW", $dow, "Machine")

ou

[Environment]::SetEnvironmentVariable("DOW", $dow, "User")

Au fait, votre script ne fonctionne pas car tout ce que vous obtenez est le code de retour PowerShell, pas les données qu'il produit. Il y a peut-être un moyen de le faire fonctionner, mais c'est finalement inutile par rapport à l'utilisation d'un script PowerShell correct.

Pour être complet, voici un bon article de Microsoft sur PowerShell et les variables environnementales :

Création et modification des variables d'environnement

Mise à jour : Après avoir examiné cette solution avec @syneticon-dj en chat, il semble que le problème que vous rencontrez en utilisant cette méthode est que l'invite de commande doit être rechargée avant qu'elle ne reflète les changements de variables environnementales qui se sont produits en externe.

Vous n'avez pas donné beaucoup de détails sur ce que vous faites, mais si c'est la seule raison pour laquelle vous lancez PowerShell, je vous suggère de revoir votre façon de faire.

Soit vous effectuez l'ensemble de votre processus à l'aide de PowerShell, soit vous avez envisagé d'utiliser plutôt des tâches planifiées ? Vous pouvez planifier des tâches en fonction du jour de la semaine.

0 votes

Le fichier batch sera exécuté chaque jour à partir des tâches programmées. Je pense travailler en powershell à la place. Mais je suis encore plus novice en powershell qu'en cmd. Et pour l'instant, j'ai des difficultés avec une commande simple. Mais je peux faire une nouvelle question à ce sujet, peut-être que c'est une question facile pour vous :) EDIT : J'ai trouvé la solution. C'était comment exécuter un programme avec des paramètres.

0 votes

Je ne suis pas non plus très doué pour PowerShell, mais ça vaut la peine de l'apprendre. Pour commencer, il est tout simplement meilleur à presque tous les égards, mais c'est aussi la façon dont Microsoft (et donc les autres fabricants) évoluent.

1 votes

Notez également que la suggestion de @Dan ci-dessus définit les variables d'environnement de façon permanente (dans le contexte Machine ou Utilisateur). Si vous omettez le troisième paramètre, vous pouvez les définir uniquement pour le processus actuel, ce qui est parfois plus souhaitable.

21voto

the-wabbit Points 40039

Je pense qu'en définissant la variable d'environnement à partir de PowerShell avec [Environment]::SetEnvironmentVariable comme suggéré par Dan est inutile, car vous perdriez le contenu de la variable à la fin de PowerShell si vous choisissez le contexte temporaire "processus" ou vous ne l'auriez pas dans l'environnement de votre fichier batch. mais si vous avez choisi le contexte permanent "machine" ou "utilisateur" - c'est-à-dire, à moins que tout votre script soit écrit en PowerShell, où le problème ne se poserait pas en premier lieu :

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser> powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS C:\Users\myuser> $dow = (get-date).dayofweek
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "User")
PS C:\Users\myuser> [Environment]::SetEnvironmentVariable("DOW", $dow, "Process")
PS C:\Users\myuser> exit

C:\Users\myuser> echo %DOW%
%DOW%

C:\Users\myuser>

Vous pourriez utiliser le for comme solution de rechange pour analyser la sortie de votre commande PowerShell et la placer dans une variable :

  for /F "usebackq tokens=1" %%i in (`powershell ^(get-date^).dayofweek`) do set DOW=%%i

Notez les caractères d'insertion ^ utilisé pour échapper aux caractères spéciaux des parenthèses dans votre appel PowerShell.

Si vous le testez à partir de la ligne de commande et non pas dans le contexte d'un fichier de traitement par lots, vous devrez remplacer l'attribut %% avant les références de variables par % :

C:\Users\myuser> for /F "usebackq tokens=1" %i in (`powershell ^(get-date^).dayofw
eek`) do set DOW=%i

C:\Users\myuser> set DOW=Friday

C:\Users\myuser>

0 votes

Non, c'est incorrect. Mon exemple ci-dessous définit des variables d'environnement "normales" qui sont accessibles depuis n'importe quel fichier batch, etc.

0 votes

@Dan Je crois que vous vous trompez, j'ai essayé de paramétrer [Environment]::SetEnvironmentVariable("DOW", $dow, "user") à partir d'une session powershell en cours d'exécution, mais il n'était pas présent dans ma session cmd parent à la fin de la session PowerShell.

0 votes

Le formatage a tout gâché, mais vous n'avez pas défini $dow. L'exécution de mon exemple dans un script Powershell stocke une variable d'environnement normale comme prévu.

4voto

humanzz Points 307

Si c'était moi, et que le script parent a pour être un Shell Shell, je ferais juste une invocation insolente de PowerShell dans le .CMD Shell comme :

set DOW=
for /f %%D in ('%SystemRoot%\System32\WindowsPowerShell\V1.0\powershell.exe -NoLogo -NoProfile -Command Write-Host -Object ^(Get-Date^).DayOfWeek;') do set DOW=%%D

Vous devrez peut-être vérifier votre politique d'exécution PowerShell (cmdlet Set-ExecutionPolicy).

2voto

Bert Points 59

Ou si vous êtes habitué à faire cela dans l'ancien Shell, ignorez complètement PowerShell.

Utilisez la variable %date% et développez le jour à partir de l'abréviation qu'elle donne (cela peut être affecté par les paramètres régionaux du format de date) :

C:\> echo %date%
Thu 09/05/2013

Saisissez le premier jeton de la réponse et développez-le :

C:\> type dayofweek.cmd
@echo off
for /f %%A in ("%date%") do set DAYOFWEEK=%%A
if "%DAYOFWEEK%" == "Mon" set DAYOFWEEK=Monday
if "%DAYOFWEEK%" == "Tue" set DAYOFWEEK=Tuesday
if "%DAYOFWEEK%" == "Wed" set DAYOFWEEK=Wednesday
if "%DAYOFWEEK%" == "Thu" set DAYOFWEEK=Thursday
if "%DAYOFWEEK%" == "Fri" set DAYOFWEEK=Friday
if "%DAYOFWEEK%" == "Sat" set DAYOFWEEK=Saturday
if "%DAYOFWEEK%" == "Sun" set DAYOFWEEK=Sunday
echo.%DAYOFWEEK%
C:\>
C:\> dayofweek
Thursday

1 votes

Windows 10 n'affiche pas le DOW en %DATE% : H:\>echo %date% 20/03/2019

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X