Основная опасность с переменной даты - это чувствительность локали. Если у вас есть PowerShell (в наши дни это встречается гораздо чаще даже в крупных корпорациях), вы можете использовать PowerShell для форматирования и обернуть его в пакетную инструкцию FOR.
Следующая строка PowerShell выполнит математику и отформатирует для вас дату: -
PowerShell $date = Get-Date; $date=$date.AddDays(-1); $date.ToString('yyyy-MM-dd')
Затем вы можете выполнить это с помощью FOR, чтобы получить его в переменную пакетного файла (не обращая внимания на экранирование целой группы символов с символом шляпы ^ и используя обратную косую черту, чтобы избежать вставленных кавычек):
for /f "usebackq" %%i in (`PowerShell $date ^= Get-Date^; $date ^= $date.AddDays^(-1^)^; $date.ToString^('yyyy-MM-dd'^)`) do set YESTERDAY=%%i echo %YESTERDAY%
Я уверен, что кто-то с превосходными навыками PowerShell и пакетного программирования может уменьшить количество команд PowerShell и / или количество экранированных символов, чтобы сделать его более читаемым / поддерживаемым.