Ich möchte eine Umgebungsvariable haben, die den Wochentag in cmd.exe enthält.
Wenn ich diesen Befehl ausführe, erhalte 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 nicht die Zeichenfolge, 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.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Sie sollten beide Befehle in PowerShell ausführen, da PowerShell Umgebungsvariablen mehr als manipulieren kann.
Dh:
oder
Ihr Skript funktioniert übrigens nicht, da Sie nur den PowerShell-Rückkehrcode und nicht die von ihm erzeugten Daten erhalten. Es kann eine Möglichkeit geben, es zum Laufen zu bringen, aber letztendlich ist es sinnlos, nur ein richtiges PowerShell-Skript zu verwenden.
Der Vollständigkeit halber ist hier ein netter Artikel von Microsoft zu PowerShell und Umgebungsvariablen:
Umgebungsvariablen erstellen und ändern
Update: Nachdem Sie diese Lösung mit @ syneticon-dj im Chat überprüft haben, besteht das Problem, das bei dieser Methode auftritt, darin, dass eine Eingabeaufforderung neu geladen werden muss, bevor Änderungen an Umgebungsvariablen berücksichtigt werden, die extern aufgetreten sind.
Sie haben nicht viele Details zu dem, was Sie gerade tun, angegeben, aber wenn dies der einzige Grund ist, warum Sie PowerShell starten, würde ich Ihnen vorschlagen, zu überprüfen, wie Sie vorgehen.
Verwenden Sie entweder PowerShell für Ihren gesamten Prozess, oder möchten Sie stattdessen geplante Aufgaben ausführen? Sie können Aufgaben basierend auf dem Wochentag planen.
quelle
Ich glaube , die Einstellung den Umgebungsvariable aus Powershell mit
[Environment]::SetEnvironmentVariable
wie von Dan vorgeschlagen ist sinnlos, da würden Sie entweder der Inhalt nach Beendigung der Powershell des Variable verlieren , wenn Sie den temporären „Prozess“ Kontext wählen oder wäre es nicht in der Batch - Datei der Umwelt haben noch Wenn Sie den permanenten "Computer" - oder "Benutzer" -Kontext gewählt haben, dh wenn Ihr gesamtes Skript nicht in PowerShell geschrieben ist, tritt das Problem nicht an erster Stelle auf:Sie können den
for
Befehl als Problemumgehung verwenden, um die Ausgabe Ihres PowerShell-Befehls zu analysieren und in eine Variable einzufügen:Beachten Sie die Caret-Zeichen, die
^
verwendet werden, um die Sonderzeichen in Klammern in Ihrem PowerShell-Aufruf zu maskieren.Wenn Sie es von der Befehlszeile aus und nicht aus einem Batch-Dateikontext heraus testen, müssen Sie die
%%
Verweise auf die Before-Variablen ersetzen durch%
:quelle
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
innerhalb einer laufenden Powershell-Sitzung vorzunehmen, aber sie war bei der Beendigung von PowerShellSET
in der Eingabeaufforderung. Wenncmd.exe
Sie versuchen, ein Kind zu gründen, sehen Sie dasselbe. Das Verhalten in PowerShell ist jedoch darauf zurückzuführen, dass das Aktualisieren der Umgebungsvariablen über die .NET-Klassen keinen Einfluss auf den aktuellen Prozess hat.Wenn es nach mir ginge, und das übergeordnete Skript hat einen Shell - Skript sein, würde ich nur einen frechen Aufruf von Powershell in der .CMD Skript wie:
Möglicherweise müssen Sie Ihre PowerShell-Ausführungsrichtlinie (Cmdlet Set-ExecutionPolicy) überprüfen.
quelle
Wenn Sie dazu in der alten Shell verheiratet sind, überspringen Sie PowerShell vollständig.
Verwenden Sie die Variable% date% und erweitern Sie den Tag anhand der angegebenen Abkürzung (dies kann durch regionale Datumsformateinstellungen beeinflusst werden):
Nimm das erste Token in der Antwort und erweitere es:
quelle
Eigentlich funktioniert es gut , wenn man so etwas wie das Folgende in eine .ps1-Datei schreibt (sagen wir
t.ps1
) und es aus einer CMD-Sitzung mit PowerShell aufruft-File t.ps1
.Aber nicht für die CMD-Sitzung, von der aus das Skript t.ps1 aufgerufen wurde. In einer neuen CMD-Sitzung erhalten wir:
Ich denke, wir müssen herausfinden, wie man so etwas wie
export T=date
in einer CMD-Sitzung macht.quelle
Wenn Sie möchten, dass Ihre Batchdatei auf Umgebungsvariablen zugreift, die mit einem PowerShell-Befehl festgelegt wurden, der über diese Batchdatei ausgeführt wird, können Sie die folgende Problemumgehung verwenden:
Erstellen Sie mit Ihrem PowerShell-Skript eine Sub-Batch-Datei mit den
mysub.bat
Zeilen "set variable = value" und führen Sie die Batch-Datei mysub.bat direkt nach dem PowerShell-Befehl aus der Haupt-Batch-Datei aus.Verwenden Sie die WriteAllLines-Methode anstelle der Standard-PowerShell-Ausgabemethoden, damit die Sub-Batch-Datei nicht mit dem UTF-8-Codierungsformat generiert wird.
Beispiel
main.bat:
quelle