Frage Wie lege ich eine Umgebungsvariable aus einem Powershell-Befehl fest?


Ich möchte eine Umgebungsvariable haben, die den Wochentag in cmd.exe enthält.

Wenn ich diesen Befehl ausführe, bekomme ich das gewünschte Ergebnis.

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

Hier versuche ich das Ergebnis in einer Umgebungsvariablen zu speichern.

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

Aber wenn ich versuche, es zu bekommen, bekomme ich die Saite nicht, wie ich wollte.

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

Mein Ziel ist es, die Variable in einer Batch-Datei für einige Backup-Skripte zu verwenden.


31
2018-01-13 09:56


Ursprung




Antworten:


Sie können etwas wie verwenden:

$env:DOW = "foo"

54
2018-06-08 01:28



Ich verstehe nicht, warum das negativ markiert wurde, weißt du von einer besser zu setzenden Umgebungsvariablen? - Ion Todirel
+1 Das funktioniert gut für mich in dem Szenario, das ich brauchte. PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas') - David Ruhmann
@IonTodirel Weil dies nur im Prozessbereich besteht. - JohnD
endlich verstehe ich nun wie man RAILS_ENV in Powershell einstellt - wired00


Ich glaube, die Umgebungsvariable von innerhalb der Powershell mit einstellen [Environment]::SetEnvironmentVariable Wie von Dan vorgeschlagen, ist es sinnlos, weil Sie den Inhalt der Variablen bei der Beendigung der Powershell verlieren würden, wenn Sie den temporären "Prozess" -Kontext wählen würden oder ihn nicht in der Umgebung Ihrer Batch-Datei hätten noch wenn Sie den permanenten "Maschinen" - oder "Benutzer" -Kontext gewählt haben - das heißt, es sei denn, Ihr gesamtes Skript ist in PowerShell geschrieben, wo das Problem von vornherein nicht auftrat:

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>

Du könntest das benutzen for Befehl als Workaround, um die Ausgabe Ihres Powershell-Befehls zu parsen und in eine Variable einzufügen

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

Beachten Sie die Caret-Zeichen ^ wird verwendet, um die Sonderzeichen der Klammer in Ihrem Powershell-Aufruf zu umgehen.

Wenn Sie es über die Befehlszeile und nicht über einen Stapeldateikontext testen, müssen Sie die Datei ersetzen %% vor variablen Referenzen nach %:

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>

15
2018-01-13 10:15



Nein, das ist falsch. Mein Beispiel unten setzt 'normale' Umgebungsvariablen, auf die von jeder Batch-Datei usw. zugegriffen werden kann. - Dan
@Dan ich glaube du täuschst dich, ich habe versucht Einstellung [Environment]::SetEnvironmentVariable("DOW", $dow, "user") innerhalb einer laufenden Powershell-Sitzung, aber es war nicht in meiner übergeordneten cmd-Sitzung nach Beendigung der PowerShell vorhanden - the-wabbit
Die Formatierung hat das vermasselt, aber Sie haben $ dow nicht definiert. Wenn Sie mein Beispiel in einem Powershell-Skript ausführen, wird eine normale Umgebungsvariable wie erwartet gespeichert. - Dan
@Dan habe ich. Und natürlich ist die Umgebungsvariable gespeichert für den Powershell-Prozess Es ist jedoch vom übergeordneten CMD-Prozess isoliert und kann dort nicht aufgerufen werden. Teste es einfach und sieh zu. - the-wabbit
@Dan BTW: Ich habe nichts gegen die Downvoting, aber es sollte darauf hingewiesen werden, dass der Ansatz demonstriert macht klar, wonach der Fragesteller gefragt hat, selbst wenn es einen eleganteren Ansatz gäbe, wäre es immer noch eine gültige Lösung für das Problem. - the-wabbit


Sie sollten beide Befehle in PowerShell ausführen, da Powershell Umgebungsvariablen mehr als nur manipulieren kann.

Id.e .:

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

oder

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

Übrigens, Ihr Skript funktioniert nicht, weil Sie nur den Returncode von Powershell erhalten, nicht die Daten, die es erzeugt. Es mag einen Weg geben, es zum Laufen zu bringen, aber es ist letztlich sinnlos, wenn man nur ein richtiges Powershell-Skript verwendet.

Der Vollständigkeit halber finden Sie hier einen schönen Artikel von MS zu Powershell und Environmental Variables:

http://technet.microsoft.com/en-us/library/ff730964.aspx

Aktualisieren: Nach der Überprüfung dieser Lösung mit @ syneticon-dj im Chat scheint das Problem, dass Sie mit dieser Methode konfrontiert werden, dass eine Eingabeaufforderung neu geladen werden muss, bevor sie Änderungen an Umgebungsvariablen widerspiegelt, die extern aufgetreten sind.

Sie haben nicht viele Details dazu angegeben, was Sie gerade tun, aber wenn dies der einzige Grund ist, warum Sie Powershell starten, würde mein Vorschlag darin bestehen, zu überprüfen, wie Sie die Dinge machen.

Führen Sie Ihren gesamten Prozess mit PowerShell durch oder haben Sie stattdessen geplante Aufgaben in Betracht gezogen? Sie können Aufgaben basierend auf dem Wochentag planen.


12
2018-01-13 10:03



Die Stapeldatei wird jeden Tag ausgeführt und von den geplanten Tasks ausgeführt. Ich denke daran, in Powershell zu arbeiten. Aber ich bin noch mehr Anfänger in Powershell als cmd. Und jetzt habe ich Schwierigkeiten mit einem einfachen Befehl. Aber ich kann eine neue Frage dazu stellen, vielleicht ist das eine einfache Sache für dich :) EDIT: Ich habe es herausgefunden. Es war, wie man ein Programm mit einigen Parametern ausführt. - Tim
Ich bin auch nicht großartig in PowerShell, aber es lohnt sich, es zu lernen. Für den Anfang ist es in fast jeder Hinsicht besser, aber es ist auch die Art und Weise, wie Microsoft (und so andere Hersteller) umzieht. - Dan
Beachten Sie auch, dass der obige Vorschlag von @ Dan die Umgebungsvariablen ziemlich dauerhaft festlegt (entweder im Kontext "Maschine" oder "Benutzer"). Wenn Sie den dritten Parameter weglassen, können Sie ihn nur für den aktuellen Prozess festlegen, was manchmal wünschenswerter ist. - Per Lundberg


Wenn ich es wäre, und das Eltern-Skript hat Um ein Shell-Skript zu sein, würde ich einfach einen frechen Aufruf der PowerShell im .CMD-Skript machen:

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

Möglicherweise müssen Sie Ihre PowerShell-Ausführungsrichtlinie überprüfen (Set-ExecutionPolicy-Cmdlet).


4
2018-06-08 21:13





Oder wenn Sie in der alten Shell damit verheiratet sind, überspringen Sie Powershell vollständig.

Verwenden Sie die Variable% date% und erweitern Sie den Tag um die Abkürzung, die er gibt (Dies kann von den Einstellungen für das regionale Datumsformat abhängen)

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

Ergreifen Sie das erste Token in der Antwort und erweitern Sie es:

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

3
2017-09-05 15:04





Wenn Sie möchten, dass Ihre Batchdatei auf Umgebungsvariablen zugreift, die von einem Powershell-Befehl aus dieser Batchdatei festgelegt werden, können Sie die folgende Problemumgehung verwenden:

Machen Sie Ihre Powershell erstellen Sie eine Unter-Batch-mysub.bat-Datei, die "set Variable = Wert" Zeilen enthält, und führen Sie diese mysub.bat Batch-Datei aus der Haupt-Batch-Datei direkt nach dem Powershell-Befehl.

Verwenden Sie die WriteAllLines-Methode und nicht die standardmäßigen Powershell-Ausgabemethoden, sodass die Unterbatchdatei nicht mit dem UTF-8-Codierungsformat generiert wird.

BEISPIEL

main.bat:

REM main.bat first line
powershell -Command "[System.IO.File]::WriteAllLines(\".\mysub.bat\", \"set VARIABLE=VALUE\");"
.\mysub.bat
echo VARIABLE=%VARIABLE%
REM expected output: VARIABLE=VALUE

1
2018-01-05 17:21





Eigentlich, wenn man etwas wie unten in eine ps1-Datei (sprich tps1) schreibt und es von einer CMD-Sitzung mit PowerShell aufruft -File t.ps1 ... es läuft gut.

$DateAndTime = (get-date -UFormat "%Y%m%d_%H%M%S")[Environment]::SetEnvironmentVariable("DateAndTime", $DateAndTime, "Machine")

Aber nicht für die CMD-Sitzung, von der aus das t.ps1-Skript aufgerufen wurde. In einer neuen CMD-Sitzung erhalten wir:

D:> echo% DateAndTime% ==> 20120208_123106

Ich schätze, wir müssen herausfinden, wie wir etwas erreichen können export T=date in einer CMD-Sitzung.


1
2018-02-08 11:55