Chcę mieć zmienną środowiskową, która zawiera dzień tygodnia w cmd.exe.
Po uruchomieniu tego polecenia otrzymuję pożądany wynik.
C:\Users\tisc> powershell (get-date).dayofweek
Friday
Tutaj próbuję zapisać wynik w zmiennej środowiskowej.
C:\Users\tisc> set dow = powershell (get-date).dayofweek
Ale kiedy próbuję go zdobyć, nie otrzymuję łańcucha tak, jak chciałem.
C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek
Moim celem jest użycie zmiennej w pliku wsadowym dla niektórych skryptów kopii zapasowych.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Powinieneś uruchomić oba polecenia w PowerShell, ponieważ PowerShell jest więcej niż zdolny do manipulowania zmiennymi środowiskowymi.
To znaczy:
lub
Nawiasem mówiąc, twój skrypt nie działa, ponieważ otrzymujesz tylko kod powrotu PowerShell, a nie generowane przez niego dane. Może istnieć sposób na uruchomienie go, ale jest to ostatecznie bezcelowe w porównaniu z użyciem odpowiedniego skryptu PowerShell.
Dla kompletności, oto miły artykuł od Microsoft na temat PowerShell i zmiennych środowiskowych:
Tworzenie i modyfikowanie zmiennych środowiskowych
Aktualizacja: po sprawdzeniu tego rozwiązania w @ syneticon-dj na czacie, wydaje się, że napotykasz problem przy użyciu tej metody, ponieważ wiersz polecenia musi zostać ponownie załadowany, zanim będzie odzwierciedlał zmiany zmiennych środowiskowych, które miały miejsce na zewnątrz.
Nie podałeś zbyt wielu szczegółów na temat tego, co robisz, ale jeśli jest to jedyny powód, dla którego uruchamiasz PowerShell, to moja rzeczywista sugestia sprawdzi, jak to robisz.
Albo cały proces używasz programu PowerShell, czy zamiast tego rozważasz użycie zaplanowanych zadań? Możesz planować zadania na podstawie dnia tygodnia.
źródło
Uważam, że ustawienie zmiennej środowiskowej w programie PowerShell za pomocą
[Environment]::SetEnvironmentVariable
sugerowanej przez Dana jest bezcelowe, ponieważ albo stracisz zawartość zmiennej po zakończeniu programu PowerShell, jeśli wybierzesz tymczasowy kontekst „procesu”, albo nie będzie go jeszcze w środowisku pliku wsadowego jeśli wybrałeś stały kontekst „komputer” lub „użytkownik” - to znaczy, chyba że cały skrypt jest napisany w PowerShell, gdzie problem nie pojawiłby się w pierwszej kolejności:Można użyć tego
for
polecenia jako obejścia, aby przeanalizować dane wyjściowe polecenia PowerShell i umieścić je w zmiennej:Zwróć uwagę na znaki karetki
^
używane do ucieczki z nawiasów specjalnych w wywołaniu PowerShell.Jeśli testujesz go z wiersza poleceń, a nie z kontekstu pliku wsadowego, musisz zastąpić
%%
odniesienia przed zmiennymi przez%
:źródło
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
z uruchomionej sesji programu PowerShell, ale nie było jej w mojej nadrzędnej sesji cmd po zakończeniu programu PowerShellSET
wierszem polecenia. Spróbuj założyć dziecko,cmd.exe
a zobaczysz to samo. Zachowanie, które widzisz w PowerShell, jest jednak spowodowane tym, że aktualizacja zmiennych środowiskowych za pomocą klas .NET nie wpływa na bieżący proces.Gdyby było mnie, a skrypt rodzic ma być skrypt, to bym po prostu zrobić bezczelny wywoływanie PowerShell w skrypcie cmd jak:
Może być konieczne sprawdzenie zasad wykonywania programu PowerShell (polecenie cmdlet Set-ExecutionPolicy).
źródło
Lub jeśli jesteś żonaty, robiąc to w starej powłoce, całkowicie pomiń PowerShell.
Użyj zmiennej% date% i rozwiń dzień ze skrótu, który daje (może to mieć wpływ na ustawienia regionalnego formatu daty):
Chwyć pierwszy token w odpowiedzi i rozwiń na nim:
źródło
W rzeczywistości, umieszczając coś takiego jak poniżej w pliku .ps1 (powiedzmy
t.ps1
) i wywołując go z sesji CMD za pomocą PowerShell-File t.ps1
... działa dobrze.Ale nie w przypadku sesji CMD, z której został wywołany skrypt t.ps1. W nowej sesji CMD otrzymujemy:
Chyba musimy dowiedzieć się, jak zrobić coś takiego jak
export T=date
sesja CMD.źródło
Jeśli chcesz, aby plik wsadowy miał dostęp do zmiennych środowiskowych ustawionych za pomocą polecenia PowerShell, uruchamianego z tego pliku wsadowego, możesz zastosować następujące obejście:
Spraw, aby skrypt PowerShell utworzył plik wsadowy podrzędny
mysub.bat
, który zawiera wiersze „ustaw zmienną = wartość”, i uruchom ten plik wsadowy mysub.bat z głównego pliku wsadowego zaraz po poleceniu PowerShell.Użyj metody WriteAllLines zamiast domyślnych metod wyjściowych PowerShell, aby plik wsadowy nie był generowany w formacie kodowania UTF-8.
Przykład
main.bat:
źródło