Como salvo a data atual no formato AAAA-MM-DD em alguma variável em um arquivo .bat do Windows?
Análogo de shell Unix:
today=`date +%F`
echo $today
windows
batch-file
Maksym Polshcha
fonte
fonte
Respostas:
Você pode obter a data atual de forma independente da localidade usando
Em seguida, você pode extrair as partes individuais usando substrings:
Outra maneira, onde você obtém variáveis que contêm as partes individuais, seria:
Muito melhor do que mexer com substrings, ao custo de poluir o namespace de sua variável.
Se você precisa do UTC em vez da hora local, o comando é mais ou menos o mesmo:
fonte
for /f
retorna duas linhas, a última das quais vazia. Você pode resolver isso usando oset MyDate=
meio. Acho que foi nisso que user2023861 tropeçou.Year
,Month
,Day
,Hour
,Minute
,Second
,Quarter
,WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
é uma resposta inválida: retorna um dígito mês e dia. Como obter 2 dígitos preenchidos à esquerda com zero mês e string de dia até a data?Se você deseja fazer isso usando comandos padrão do MS-DOS em um arquivo em lote, você pode usar:
Tenho certeza que isso pode ser melhorado ainda mais, mas isso fornece a data em 3 variáveis para Dia (dd), Mês (mm) e Ano (aaaa). Você pode usá-los posteriormente em seu script de lote, conforme necessário.
Embora eu entenda que uma resposta foi aceita para esta pergunta, este método alternativo pode ser apreciado por muitos que procuram conseguir isso sem usar o console WMI, então espero que agregue algum valor a esta pergunta.
fonte
Use
date /T
para localizar o formato no prompt de comando.Se o formato da data for
Thu 17/03/2016
usado assim:fonte
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
".%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
Mais duas maneiras que não dependem das configurações de tempo (ambas tiradas de Como obter dados / hora independente da localização ). E ambos também obtêm o dia da semana e nenhum deles requer permissões de administrador !:
MAKECAB - funcionará em TODOS os sistemas Windows (rápido, mas cria um pequeno arquivo temporário) (o script foxidrive):
ROBOCOPY - não é um comando nativo para Windows XP e Windows Server 2003 , mas pode ser baixado do site da Microsoft . Mas está integrado em tudo, desde o Windows Vista e superior:
E mais três maneiras que usam outras linguagens de script do Windows. Eles lhe darão mais flexibilidade, por exemplo, você pode obter a semana do ano, o tempo em milissegundos e assim por diante.
Híbrido JScript / BATCH (precisa ser salvo como
.bat
). JScript está disponível em todos os sistemas do Windows NT e superior, como parte do Windows Script Host ( embora possa ser desativado por meio do registro, é um caso raro ):Híbrido VBScript / BATCH ( é possível incorporar e executar VBScript em um arquivo em lote sem usar um arquivo temporário? ) Mesmo caso que jscript, mas a hibridização não é tão perfeita:
PowerShell - pode ser instalado em todas as máquinas que possuem .NET - baixe da Microsoft ( v1 , v2 e v3 (apenas para Windows 7 e superior)). Instalado por padrão em tudo do Windows 7 / Win2008 e superior:
Jscript.net/batch autocompilado (nunca vi uma máquina Windows sem .NET, então acho que é bastante portátil):
Logman Não é possível obter o ano e o dia da semana. É comparativamente lento, também cria um arquivo temporário e é baseado nos registros de data e hora que o logman coloca em seus arquivos de log. Funcionará em tudo a partir do Windows XP e superior. Provavelmente nunca será usado por ninguém - incluindo eu - mas é mais uma forma ...
Mais informações sobre a função Get-Date .
fonte
Eu realmente gostei do método de Joey, mas pensei em expandi-lo um pouco.
Nessa abordagem, você pode executar o código várias vezes e não se preocupar com o valor de data antigo "persistente" porque já está definido.
Cada vez que você executar este arquivo em lote, ele produzirá uma representação combinada de data e hora compatível com ISO 8601.
Nesta versão, você terá que ter cuidado para não copiar / colar o mesmo código em vários lugares no arquivo, pois isso causaria rótulos duplicados. Você pode ter um rótulo separado para cada cópia ou apenas colocar esse código em seu próprio arquivo em lote e chamá-lo de seu arquivo de origem sempre que necessário.
fonte
Basta usar a
%date%
variável:fonte
De acordo com a resposta de @ProVi, basta mudar para se adequar à formatação que você precisa
retornará
EDITAR De acordo com o comentário de @Jeb, quem está correto o formato de hora acima só funcionará se o seu comando DATE / T retornar
É fácil editar para se adequar à sua localidade, no entanto, usando a indexação de cada caractere na string retornada pela variável de ambiente% DATE% relevante, você pode extrair as partes da string de que precisa.
por exemplo. Usar% DATE ~ 10,4% expandiria a variável de ambiente DATE e, em seguida, usaria apenas os 4 caracteres que começam no 11º (deslocamento 10) caractere do resultado expandido
Por exemplo, se usar datas no estilo dos EUA, o seguinte se aplica
fonte
Eu defino uma variável de ambiente com o valor no formato numérico desejado fazendo isto:
fonte
Verifique este ..
fonte
Se você tiver o Python instalado, você pode fazer
Você pode adaptar facilmente a string de formato às suas necessidades.
fonte
python -c "import datetime;print(datetime.date.today())"
, porque o__str__
método dadate
classe apenas chamaisoformat()
.É possível usar o PowerShell e redirecionar sua saída para uma variável de ambiente usando um loop.
Na linha de comando (
cmd
):Em um arquivo em lote, você pode escapar
%a
como%%a
:fonte
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
então use MM superior para mês e barra invertida para escapar de caracteres literais.Devido ao formato de data e hora ser uma informação específica do local, recuperá-los das variáveis% date% e% time% exigirá um esforço extra para analisar a string com a transformação do formato em consideração. Uma boa ideia é usar alguma API para recuperar a estrutura de dados e analisá-la como desejar. WMIC é uma boa escolha. O exemplo abaixo usa Win32_LocalTime . Você também pode usar Win32_CurrentTime ou Win32_UTCTime .
Resultado:
25-04-2018_10: 03: 11
fonte
Esta é uma extensão da resposta de Joey para incluir a hora e preencher as partes com zeros.
Por exemplo, o resultado será 2019-06-01_17-25-36. Observe também que esta é a hora UTC.
fonte
fonte
Estou usando o seguinte:
Ou em combinação com um nome de arquivo de log 'MyLogFileName':
fonte
Se o PowerShell estiver disponível, você pode usar os códigos abaixo:
Aqui está o resultado:
fonte
Se você não se importa em um investimento único de 10 a 30 minutos para obter uma solução confiável (que não depende das configurações regionais do Windows), continue lendo.
Vamos libertar nossas mentes. Você deseja simplificar os scripts para ficarem assim? (Suponha que você deseja definir a variável LOG_DATETIME)
Você pode. Basta construir um FormatNow.exe com C # .NET e adicioná-lo ao seu PATH.
Notas:
Benefícios:
Código-fonte do FormatNow.exe que construí com o Visual Studio 2010 (prefiro construí-lo sozinho para evitar o risco de baixar um programa desconhecido e possivelmente malicioso). Apenas copie e cole os códigos abaixo, crie o programa uma vez e você terá um formatador de data confiável para todos os usos futuros.
Em geral, ao lidar com lógicas complicadas, podemos torná-lo mais simples construindo um programa muito pequeno e chamando o programa para capturar a saída de volta para uma variável de script em lote. Não somos alunos e não estamos fazendo exames que nos obriguem a seguir a regra somente script em lote para resolver problemas. No ambiente de trabalho real, qualquer método (legal) é permitido. Por que ainda devemos nos ater aos recursos pobres do script em lote do Windows, que precisa de soluções alternativas para muitas tarefas simples? Por que devemos usar a ferramenta errada para o trabalho?
fonte