Como posso obter a data em um formato independente de localidade em um arquivo em lotes?

1

Estou tentando ler um arquivo que contém uma data no nome do arquivo.

O problema é quando o formato de data é US no sistema: mm/dd/yyyy não funciona.

Para este formato: dd/mm/yyyy funciona como esperado.

Eu preciso obter a data neste formato dd/mm/yyyy , mesmo assim o sistema está definido no formato americano.

Sou novo em lote e não tenho ideia de como obter a data no formato necessário.

Aqui está o meu arquivo de lote:

for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
rem Lets name our new variable "rdate" for reverse date
set _date=%%a-%%b-%%c
)

set source=%path%.csv
echo %source%
set dest=%path%_%_date%.csv
echo %dest%
    
por user3070123 22.01.2018 / 10:06

2 respostas

2

Parece uma má ideia analisar uma data que pode estar em vários formatos cujo formato você não conhece. É melhor obter a data em um formato específico, mesmo que isso signifique não puro lote, mas invocar o powershell.

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22__09_15_33

ou sem tempo.

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22

C:\Users\tod>

Depois de fazer isso, você pode fazer

C:\Users\tod>echo %datetime:~0,4%
2018

C:\Users\tod>

E assim por diante ... Então você pode definir qualquer variável para igualar o ano, mês, data no mês.

Adicionado

Se você não quiser usar o powershell e não se importar que isso funcione apenas para datas formatadas nos EUA.

C:\Users\tod>echo %date%
01/22/2018

C:\Users\tod>echo %date:~0,2%
01

C:\Users\tod>echo %date:~3,2%
22

C:\Users\tod>echo %date:~6,4%
2018

C:\Users\tod>

Então você realmente deve ser capaz de ver como fazer isso

set first=%date:~0,2%

set second=%date:~3,2%

set third=%date:~6,4%


C:\Users\tod>set first=%date:~0,2%

C:\Users\tod>set second=%date:~3,2%

C:\Users\tod>set third=%date:~6,4%

C:\Users\tod>echo %first%/%second%/%third%
01/22/2018

C:\Users\tod>echo %second%/%first%/%third%
22/01/2018

C:\Users\tod>

Você pode dizer set ukdate=%second%/%first%/%third% e pode dizer echo %ukdate%

E esse método não-powershell só funciona se você souber o formato da data no sistema e souber que é o EUA. Eu recomendaria geralmente contra lote, porque por exemplo o que se uma nova revisão do sistema operacional vem junto ea saída de um comando é um pouco diferente e seu código presume um formato específico em sua análise. E enquanto neste caso o lote é em um sentido, puro, às vezes pode ser como bater palitos juntos. É uma boa ideia saber lote e usá-lo um pouco, mas para instalar alguma outra linguagem de script como Ruby ou Python ou Golang ou NodeJS. Mas se você quiser usar apenas um lote para isso, então é isso.

    
por 22.01.2018 / 10:18
0

Como posso obter a data em um arquivo de lote em um formato independente de localidade?

I need to be displayed with this format dd/mm/yyyy

Primeiro, o que não fazer:

  • Usar %date% para fornecer uma solução é, conforme usado na outra resposta, dependente das configurações de Localidade, Regional e Idioma do SO e pode fornecer informações erradas ou ausentes.

  • Por exemplo, o formato de data abreviada no meu PC não exibe o dia da semana.

O caminho certo para resolver o problema:

  • O uso de wmic , por outro lado, funciona de maneira independente do idioma local, idioma ou formato de data escolhido pelo usuário (Painel de Controle / Regional).

O arquivo de lote a seguir usa wmic para recuperar a data e a hora (local), portanto, não sofre a desvantagem de uma solução usando %date% .

getdate.cmd:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in ('wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"') do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
echo %_day%/%_month%/%_year%
endlocal

Exemplo de saída:

> getdate
22/01/2018

Modifique seu arquivo de lote conforme apropriado para usar o código acima, por exemplo:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in ('wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"') do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
set source=%path%.csv
echo %source%
set dest=%path%_%_day%/%_month%/%_year%.csv
echo %dest%
endlocal

Leitura adicional

  • Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • para / f - Comando Loop contra os resultados de outro comando.
  • getdate - Exibe a data e a hora independentemente da localidade do SO, idioma ou o formato de data escolhido pelos usuários (Painel de Controle / Regional ).
  • variáveis - Extrai parte de uma variável (substring).
  • wmic - Comando de instrumentação de gerenciamento do Windows.
por 22.01.2018 / 12:51