você pode usar algo como:
$env:DOW = "foo"
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.
você pode usar algo como:
$env:DOW = "foo"
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>
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:
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.
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).
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
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
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.