Я хочу иметь переменную среды, которая содержит день недели в cmd.exe.
Когда я запускаю эту команду, я получаю желаемый результат.
C:\Users\tisc> powershell (get-date).dayofweek
Friday
Здесь я пытаюсь сохранить результат в переменной окружения.
C:\Users\tisc> set dow = powershell (get-date).dayofweek
Но когда я пытаюсь получить это, я не получаю строку, как я хотел.
C:\Users\tisc> set dow
DoW=0
dow = powershell (get-date).dayofweek
Моя цель - использовать переменную в командном файле для некоторых скриптов резервного копирования.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Вы должны запустить обе команды в PowerShell, поскольку PowerShell более чем способен манипулировать переменными среды.
То есть:
или же
Кстати, ваш скрипт не работает, потому что вы получаете только код возврата PowerShell, а не данные, которые он генерирует. Возможно, есть способ заставить его работать, но в конечном счете это бессмысленно по сравнению с использованием только правильного сценария PowerShell.
Для полноты вот хорошая статья от Microsoft по PowerShell и переменным среды:
Создание и изменение переменных среды
Обновление. Изучив это решение с помощью @ syneticon-dj в чате, вы обнаружите, что проблема, с которой вы сталкиваетесь при использовании этого метода, заключается в том, что необходимо перезагрузить командную строку, прежде чем она отразит изменения переменных среды, которые произошли извне.
Вы не предоставили подробных сведений о том, чем вы занимаетесь, но если это единственная причина, по которой вы запускаете PowerShell, то мое реальное предложение - проанализировать, как вы это делаете.
Либо весь ваш процесс использует PowerShell, либо вместо этого вы решили использовать запланированные задачи? Вы можете планировать задачи в зависимости от дня недели.
источник
Я считаю , установив переменные окружения внутри PowerShell с
[Environment]::SetEnvironmentVariable
как это было предложено Dan бессмысленно, потому что вы либо потерять содержимое переменного по окончанию PowerShell , если вы выбрали временный «процесс» контекст или не иметь его в среде пакетной обработки файла еще если вы выбрали постоянный «машинный» или «пользовательский» контекст - то есть, если весь ваш сценарий не написан в PowerShell, где проблема не возникнет в первую очередь:Вы можете использовать
for
команду в качестве обходного пути, чтобы проанализировать выходные данные вашей команды PowerShell и поместить ее в переменную:Обратите внимание на символы вставки,
^
используемые для экранирования специальных символов в скобках в вызове PowerShell.Если вы тестируете его из командной строки, а не из контекста пакетного файла, вам нужно будет заменить
%%
ссылки перед переменными на%
:источник
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
изнутри сеанс PowerShell, но он не присутствовал в моем родительском сеансе cmd после завершения PowerShellSET
в командной строке. Попробуйте завести ребенка,cmd.exe
и вы увидите то же самое. Однако поведение, которое вы наблюдаете в PowerShell, заключается в том, что обновление переменных среды с помощью классов .NET не влияет на текущий процесс.Если бы это был я, а родительский сценарий должен быть сценарием оболочки, я бы просто сделал дерзкий вызов PowerShell в сценарии .CMD, например:
Возможно, вам придется проверить политику выполнения PowerShell (командлет Set-ExecutionPolicy).
источник
Или, если вы женаты, чтобы делать это в старой оболочке, полностью пропустите PowerShell.
Используйте переменную% date% и разверните день из полученного сокращения (это может зависеть от региональных настроек формата даты):
Возьмите первый жетон в ответе и расскажите о нем:
источник
На самом деле, если поместить что-то подобное ниже в файл .ps1 (скажем,
t.ps1
) и вызвать его из сеанса CMD с PowerShell-File t.ps1
... это работает хорошо.Но не для сеанса CMD, откуда был вызван скрипт t.ps1. В новой сессии CMD мы получаем:
Я предполагаю, что мы должны выяснить, как сделать что-то вроде
export T=date
сеанса CMD.источник
Если вы хотите, чтобы ваш пакетный файл имел доступ к переменным среды, установленным командой PowerShell, из этого пакетного файла, вы можете использовать следующий обходной путь:
Сделайте так, чтобы ваш скрипт PowerShell создал файл
mysub.bat
подпакета, содержащий строки «set variable = value», и запустите этот пакетный файл mysub.bat из основного пакетного файла сразу после команды PowerShell.Используйте метод WriteAllLines вместо методов вывода PowerShell по умолчанию, чтобы файл подпакета не создавался в формате кодировки UTF-8.
пример
main.bat:
источник