Quero ter uma variável de ambiente que contenha o dia da semana em cmd.exe.
Quando executo esse comando, obtenho o resultado desejado.
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 tento obtê-lo, não entendo a corda 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.
PowerShell -Command $env:Note = 'Elevate'; (New-Object -com 'Shell.Application').ShellExecute('cmd.exe', '/k %*', '', 'runas')
Você deve executar os dois comandos no PowerShell, pois o PowerShell é mais do que capaz de manipular variáveis ambientais.
Ou seja:
ou
A propósito, seu script não funciona porque tudo o que você recebe é 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 comparado ao uso de um script do PowerShell adequado.
Para completar, aqui está um bom artigo da Microsoft no PowerShell e variáveis ambientais:
Criando e modificando variáveis de ambiente
Atualização: Depois de revisar esta solução com @ syneticon-dj no chat, parece que o problema que você enfrenta usando esse método é que um prompt de comando deve ser recarregado antes de refletir as alterações nas variáveis ambientais que ocorreram externamente.
Você não forneceu muitos detalhes sobre o que está fazendo, mas se esse é o único motivo pelo qual você está lançando o PowerShell, minha sugestão real seria revisar como você está fazendo as coisas.
Todo o seu processo usando o PowerShell ou você já pensou em usar tarefas agendadas? Você pode agendar tarefas com base no dia da semana.
fonte
Acredito que definir a variável de ambiente de dentro do PowerShell com
[Environment]::SetEnvironmentVariable
como sugerido por Dan é inútil, porque você quer perder o conteúdo da variável após o término do PowerShell se você escolheu o contexto temporário "processo" ou não tê-lo dentro do ambiente do seu arquivo de lote ainda se você escolher o contexto permanente "máquina" ou "usuário" - ou seja, a menos que todo o script seja escrito no PowerShell, em que o problema não surgiria em primeiro lugar:Você pode usar o
for
comando como uma solução alternativa para analisar a saída do seu comando do PowerShell e colocá-lo em uma variável:Observe os caracteres de interpolação
^
usados para escapar dos caracteres especiais entre parênteses na chamada do PowerShell.Se você estiver testando a partir da linha de comando e não de um contexto de arquivo em lote, será necessário substituir as
%%
referências à variável anterior por%
:fonte
[Environment]::SetEnvironmentVariable("DOW", $dow, "user")
de dentro de uma sessão do PowerShell em execução, mas não estava presente na minha sessão cmd pai após a rescisão do PowerShellSET
prompt de comando. Tente começar um filhocmd.exe
e você verá a mesma coisa. O comportamento que você vê no PowerShell é que a atualização das variáveis de ambiente por meio das classes .NET não afeta o processo atual.Se fosse eu, e o script pai tivesse que ser um shell, eu faria uma invocação atrevida do PowerShell no script .CMD como:
Pode ser necessário verificar sua política de execução do PowerShell (cmdlet Set-ExecutionPolicy).
fonte
Ou, se você é casado com isso no shell antigo, pule completamente o PowerShell.
Use a variável% date% e expanda o dia a partir da abreviação que ela fornece (isso pode ser afetado pelas configurações de formato de data regional):
Pegue o primeiro token na resposta e expanda:
fonte
Na verdade, ao colocar algo como o abaixo em um arquivo .ps1 (por exemplo
t.ps1
) e chamá-lo de uma sessão CMD com o PowerShell-File t.ps1
... funciona bem.Mas não para a sessão CMD da qual o script t.ps1 foi chamado. Em uma nova sessão de CMD, obtemos:
Acho que temos que descobrir como fazer algo parecido
export T=date
em uma sessão de CMD.fonte
Se você deseja que seu arquivo em lote acesse variáveis de ambiente definidas por um comando do PowerShell, execute a partir desse arquivo em lotes, use a seguinte solução alternativa:
Faça seu script do PowerShell criar um arquivo de
mysub.bat
subbatch,, que contém linhas "set variable = value" e execute esse arquivo de lote mysub.bat a partir do arquivo de lote principal, logo após o comando do PowerShell.Use o método WriteAllLines em vez dos métodos de saída padrão do PowerShell, para que o arquivo de sub-lote não seja gerado com o formato de codificação UTF-8.
Exemplo
main.bat:
fonte