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 souhaité.
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 ne reçois pas la ficelle comme je le voulais.
C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek
Mon objectif est d’utiliser la variable dans un fichier de commandes pour certains scripts de sauvegarde.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Vous devez exécuter les deux commandes dans PowerShell, car PowerShell est plus que capable de manipuler des variables d'environnement.
C'est à dire:
ou
En passant, votre script ne fonctionne pas car tout ce que vous obtenez est le code de retour PowerShell, pas les données qu'il génère. Il y a peut-être un moyen de le faire fonctionner, mais c'est finalement inutile par rapport à un simple script PowerShell.
Pour être complet, voici un bel article de Microsoft sur PowerShell et les variables environnementales:
Création et modification de variables d'environnement
Mise à jour: après avoir examiné cette solution avec @ syneticon-dj dans le chat, il semble que le problème que vous rencontrez avec cette méthode est qu'une invite de commande doit être rechargée avant de refléter les modifications des variables d'environnement qui se sont produites en externe.
Vous n'avez pas fourni beaucoup de détails sur ce que vous faites, mais si c'est la seule raison pour laquelle vous lancez PowerShell, alors je vous suggère de revoir votre façon de faire.
Votre processus entier utilise-t-il PowerShell ou avez-vous envisagé d'utiliser des tâches planifiées à la place? Vous pouvez planifier des tâches en fonction du jour de la semaine.
la source
Je pense qu'il
[Environment]::SetEnvironmentVariable
est inutile de définir la variable d'environnement à partir de PowerShell, comme suggéré par Dan, car vous perdriez le contenu de la variable à la fin de PowerShell si vous choisissiez le contexte "processus" temporaire ou ne l'aviez pas encore dans l'environnement de votre fichier de traitement par lots . si vous avez choisi le contexte permanent "machine" ou "utilisateur" - c'est-à-dire, sauf si votre script est entièrement écrit dans PowerShell, le problème ne se posant pas en premier lieu:Vous pouvez utiliser la
for
commande comme solution de contournement pour analyser le résultat de votre commande PowerShell et le placer dans une variable:Notez les caractères d'insertion
^
utilisés pour échapper les caractères spéciaux entre parenthèses dans votre appel PowerShell.Si vous le testez à partir de la ligne de commande et non à partir d'un contexte de fichier de commandes, vous devrez remplacer les
%%
références de variable précédentes par%
:la source
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
une session dans une session PowerShell en cours, mais celle-ci n'était pas présente dans la session de ma commande parent à la fin de PowerShellSET
dans l'invite de commande. Essayez de démarrer un enfantcmd.exe
et vous verrez la même chose. Cependant, le comportement observé dans PowerShell est dû au fait que la mise à jour des variables d'environnement via les classes .NET n'affecte pas le processus en cours.Si elle était moi, et le script parent doit être un script shell, je venais de faire une invocation insolente de PowerShell dans le script .CMD comme:
Vous devrez peut-être vérifier votre stratégie d'exécution de PowerShell (cmdlet Set-ExecutionPolicy).
la source
Ou si vous êtes marié à faire cela dans l'ancienne coquille, ignorez complètement PowerShell.
Utilisez la variable% date% et développez le jour à partir de l’abréviation qu’il donne (ceci pourrait être affecté par les paramètres de format de date régionaux):
Saisissez le premier jeton dans la réponse et développez-le:
la source
En fait, lorsque vous insérez quelque chose comme celui-ci dans un fichier .ps1 (par exemple,
t.ps1
) et que vous l'appelez à partir d'une session CMD avec PowerShell-File t.ps1
... cela fonctionne bien.Mais pas pour la session CMD où le script t.ps1 a été appelé. Dans une nouvelle session CMD, nous obtenons:
Je suppose que nous devons trouver comment faire quelque chose comme
export T=date
dans une session CMD.la source
Si vous souhaitez que votre fichier de commandes accède aux variables d'environnement définies par une commande PowerShell exécutées à partir de ce fichier de commandes, vous pouvez utiliser la solution de contournement suivante:
Demandez à votre script PowerShell de créer un sous-fichier de commandes,
mysub.bat
contenant les lignes "set variable = value", puis exécutez ce fichier de commandes mysub.bat à partir du fichier de commandes principal juste après la commande PowerShell.Utilisez la méthode WriteAllLines plutôt que les méthodes de sortie par défaut de PowerShell afin que le fichier de sous-traitement ne soit pas généré avec le format de codage UTF-8.
Exemple
main.bat:
la source