Como eu configuro uma variável de ambiente a partir de um comando do powershell?

34

Eu quero ter uma variável de ambiente que contenha o dia da semana no cmd.exe.

Quando eu executo este comando, recebo o resultado que quero.

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

Aqui estou tentando armazenar o resultado em uma variável de ambiente.

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

Mas quando eu tento entender não entendo a string como queria.

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

Meu objetivo é usar a variável em um arquivo em lotes para alguns scripts de backup.

    
por Tim 13.01.2012 / 10:56

7 respostas

58

você pode usar algo como:

$env:DOW = "foo"
    
por 08.06.2013 / 03:28
17

Acredito que definir a variável de ambiente dentro do powershell com [Environment]::SetEnvironmentVariable como sugerido por Dan é inútil porque você perderia o conteúdo da variável após o encerramento do powershell se escolhesse o contexto de "processo" temporário ou não o tivesse dentro o ambiente do seu arquivo de lote ainda se você escolheu o contexto "máquina" ou "usuário" permanente - ou seja, a menos que todo o script seja escrito no PowerShell, onde o problema não surgiria: / p>

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>

Você poderia usar o comando for como uma solução alternativa para analisar a saída do seu comando powershell e colocá-lo em uma variável

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

Observe que os caracteres de circunflexo ^ usados para escapar dos caracteres especiais parênteses dentro de sua chamada do powershell.

Se você estiver testando a partir da linha de comando e não a partir de um contexto de arquivo em lote, será necessário substituir o %% antes das referências da variável por % :

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>
    
por 13.01.2012 / 11:15
13

Você deve executar os dois comandos no PowerShell, pois o Powershell é mais do que capaz de manipular variáveis ambientais.

Ou seja:

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

ou

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

A propósito, o seu script não funciona porque tudo o que você está obtendo é o código de retorno do Powershell, não os dados que ele produz. Pode haver uma maneira de fazê-lo funcionar, mas, em última análise, é inútil se comparado a usar um roteiro Powershell apropriado.

Para completar, aqui está um belo artigo do MS em Powershell e Environmental Variables:

link

Atualização: Tendo analisado esta solução com @ syneticon-dj no chat, parece que o problema que você enfrenta usando este método é que um prompt de comando precisa ser recarregado antes de refletir as mudanças nas variáveis ambientais que aconteceram externamente.

Você não forneceu muitos detalhes sobre o que está fazendo, mas se essa é a única razão pela qual está lançando o Powershell, minha sugestão real seria analisar como você está fazendo as coisas.

Você faz todo o processo usando o PowerShell ou já considerou o uso de tarefas agendadas? Você pode agendar tarefas com base no dia da semana.

    
por 13.01.2012 / 11:03
4

Se fosse eu, e o script pai tivesse como um script de shell, eu faria uma involuntária invocação do PowerShell no script .CMD como:

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

Talvez seja necessário verificar sua política de execução do PowerShell (cmdlet Set-ExecutionPolicy).

    
por 08.06.2013 / 23:13
3

Ou se você for casado a fazer isso na velha concha, ignore o Powershell completamente.

Use a variável% date% e expanda o dia a partir da abreviação fornecida (Isso pode ser afetado pelas configurações de formato de data regionais)

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

Pegue o primeiro token na resposta e expanda-o:

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
    
por 05.09.2013 / 17:04
1

Se você quiser que seu arquivo de lote acesse variáveis de ambiente definidas por um comando powsershell executado a partir desse arquivo de lote, use a seguinte solução alternativa:

faça com que seu powershell crie um arquivo de sub-arquivo mysub.bat que contenha as linhas "set variable = value", e execute o arquivo batch mysub.bat a partir do arquivo de lote principal logo após o comando powershell.

Use o método WriteAllLines em vez dos métodos padrão de saída powsershell para que o arquivo sub-batch não seja gerado com o formato de codificação UTF-8.

EXEMPLO

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
    
por 05.01.2015 / 18:21
1

Na verdade, ao colocar algo como abaixo em um arquivo ps1 (digamos t.ps1) e chamá-lo de uma sessão CMD com o PowerShell -File t.ps1 ... ele funciona bem.

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

Mas não para a sessão CMD em que o script t.ps1 foi chamado. Em uma nova sessão do CMD, obtemos:

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

Eu acho que temos que descobrir como fazer algo como export T=date em uma sessão CMD.

    
por 08.02.2012 / 12:55