ChatGPT解决这个技术问题 Extra ChatGPT

如何以适合文件/文件夹名称的格式在 Windows 命令行上获取当前日期/时间?

更新:现在是 2016 年,我会为此使用 PowerShell,除非有真正令人信服的向后兼容原因,特别是因为使用 date 的区域设置问题。查看@npocmaka 的https://stackoverflow.com/a/19799236/8479

我可以使用什么 Windows 命令行语句以可以放入文件名的格式获取当前日期时间?

我想要一个 .bat 文件,它将一个目录压缩到一个存档中,并将当前日期和时间作为名称的一部分,例如 Code_2008-10-14_2257.zip。有没有什么简单的方法可以做到这一点,独立于机器的区域设置?

我真的不介意日期格式,理想情况下它是 yyyy-mm-dd,但任何简单的都可以。

到目前为止,我已经得到了这个,它在我的机器上给了我 Tue_10_14_2008_230050_91

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

我可以忍受这个,但它似乎有点笨拙。理想情况下,它会更简短,并具有前面提到的格式。

我正在使用 Windows Server 2003 和 Windows XP Professional。我不想安装额外的实用程序来实现这一点(尽管我意识到有些可以很好地格式化日期)。

为您的代码创建自动备份?对你有益!我们也应该这样做:)
使用 powershell 人... [datetime]::now.tostring("yyyy-MM-dd")
是否可以在 SQL Server 中使用 xp_cmdshell 加载具有创建日期的文件?我问了一个关于 stackoverflow 的问题,请查看链接@stackoverflow.com/q/32293517/3327081

P
Peter Mortensen

请参阅 Windows Batch File (.bat) to get current date in MMDDYYYY format

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

如果您更喜欢 24 小时/军用格式的时间,您可以将第二个 FOR 行替换为:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:> .\date.bat 2008-10-14_0642

如果您想要独立于地区日/月顺序的日期,则可以使用“WMIC os GET LocalDateTime”作为源,因为它是 ISO 顺序:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:>test.cmd 本地日期为 [2012-06-19 10:23:47.048]


对于英国人,您需要 For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) 作为第二行。
此解决方案依赖于语言环境,Rory 以英国为例,其他语言环境的日期为 22-02-2012,您需要将 delims=/ 替换为 delims=-
在我的系统上,%TIME% 返回诸如“0:01:15”和“3:15:12”之类的值,并且答案中的 %%a%%b 代码给出了一个前导空格,例如“001”和“315”。要获得四位数的 hhmm,请使用以下命令:For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b)) 这会返回像“0001”和“0315”这样的值,我更喜欢在我的文件名中使用它们。
wmic 命令的好版本!到目前为止,我只看到了 WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table。同样,要在我当地的阿姆斯特丹时区获得 20120623-1619,只需一行:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
对我来说它说%%a was unexpected at this time.
P
Peter Mortensen

另外两种不依赖于时间设置的方法(均取自 :How get data/time independent from localization:)。两者也都获得了星期几,而且都不需要管理员权限!:

MAKECAB - 适用于每个 Windows 系统(速度快,但会创建一个小临时文件)(foxidrive 脚本):@echo off pushd "%temp%" makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do ( set "current-date=%%e-%%b-%% c" set "current-time=%%d" set "weekday=%%a" ) del ~.* popd echo %weekday% %current-date% %current-time% pause 有关获取日期函数的更多信息。 ROBOCOPY - 它不是 Windows XP 和 Windows Server 2003 的本机命令,但可以从 microsoft 站点下载。但在 Windows Vista 及更高版本的所有内容中都内置:@echo off setlocal for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=:" %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do ( 设置 "dow=%%D" set "month=%%E" set "day=%%F " set "HH=%%G" set "MM=%%H" set "SS=%%I" set "year=%%J" ) echo 星期几:%dow% echo 月份日期:% day% echo Month : %month% echo hour : %HH% echo minutes : %MM% echo seconds : %SS% echo year : %year% endlocal 还有另外三种使用其他 Windows 脚本语言的方法。它们会给你更多的灵活性,例如你可以得到一年中的一周,毫秒的时间等等。 JScript/batch 混合(需要保存为 .bat)。 JScript 在 NT 及更高版本的每个系统上都可用,作为 Windows Script Host 的一部分(尽管可以通过注册表禁用,但这种情况很少见):@if (@X)==(@Y) @end /* -- - 以 JScript 注释开头的无害混合行 @echo off cscript //E:JScript //nologo "%~f0" exit /b 0 *------------------- -------------------------------------------------- ---------*/ function GetCurrentDate() { // 今天日期时间将用于设置为默认日期。 var todayDate = new Date(); todayDate = todayDate.getFullYear() + "-" + ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" + ("0" + todayDate.getDate())。 slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" + ("0" + todayDate.getMinutes()).slice(-2);返回今天日期; } WScript.Echo(GetCurrentDate()); VSCRIPT/BATCH 混合(是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行 VBScript?)与 JScript 相同,但混合不是那么完美: :sub echo(str) :end sub echo off '>nul 2>&1||复制 /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul '& echo 当前日期:'& cscript /nologo /E:vbscript "%~f0" '& exit /b '0 = vbGeneralDate - 默认值。如果指定,则返回日期:mm/dd/yy 和时间:hh:mm:ss PM/AM。 '1 = vbLongDate - 返回日期:工作日、月份名称、年份 '2 = vbShortDate - 返回日期:mm/dd/yy '3 = vbLongTime - 返回时间:hh:mm:ss PM/AM '4 = vbShortTime - 返回时间: hh:mm WScript.echo Replace(FormatDateTime(Date,1),", ","-") PowerShell - 可以安装在每台具有 .NET 的机器上 - 从 Microsoft 下载(v1、v2、v3(仅适用于 Windows 7)以上))。它默认安装在 Windows 7/Windows Server 2008 及更高版本的所有设备上:C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}" 要从批处理文件中使用它:for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%# 自编译 jscript.net/batch (从未见过没有 .NET 的 Windows 机器,所以我认为这是一个非常便携的):@if (@X)==(@Y) @end /****** 启动 JScript 注释的静默行 ****** @ echo off ::::::::::::::::::::::::::::::::::: ::: 编译脚本 :::: :: :::::::::::::::::::::::::::::::::: setlocal if exists "%~n0.exe" goto :skip_compilation set "frm =%SystemRoot%\Microsoft.NET\Framework\" :: 搜索最新安装的 .NET 框架中的 /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:- n "%SystemRoot%\Microsoft.NET\Framework\v*"') 做 (如果存在 "%%v\jsc.exe" ( rem :: javascript.net 编译器设置 "jsc=%%~dpsnfxv\jsc. exe" goto :break_loop ) ) echo jsc.exe not found && exit /b 0 :break_loop call %jsc% /nologo / out:"%~n0.exe" "%~dpsfnx0" ::::::::::::::::::::::::::::::::::::: ::: 编译结束 :::: :::::::::::::::::::::::::::::::::::::skip_compilation "% ~n0.exe" exit /b 0 ****** JScript 注释结束 ******/ import System;导入 System.IO; var dt=日期时间。现在; Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); Logman 这不能得到星期几。它相对较慢,并且还会创建一个临时文件,并且基于 logman 在其日志文件上放置的时间戳。它适用于 Windows XP 及更高版本的所有设备。它可能永远不会被任何人使用 - 包括我 - 但还有另一种方式...... @echo off setlocal del /q /f %temp%\timestampfile_* Logman.exe stop ts-CPU 1>nul 2>&1 Logman。 exe delete ts-CPU 1>nul 2>&1 Logman.exe 创建计数器 ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ > nul Logman.exe 启动 ts-CPU 1>nul 2>&1 Logman.exe 停止 ts-CPU >nul 2>&1 Logman.exe 删除 ts-CPU >nul 2>&1 for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') 设置时间戳=%%t echo %timestamp% echo MM: %timestamp:~0,2 % echo dd: %timestamp:~2,2% echo hh: %timestamp:~4,2% echo mm: %timestamp:~6,2% endlocal exit /b 0 WMIC 的另一种方法,它也给出了一周年和星期几,但不是毫秒(毫秒检查 foxidrive 的答案): for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in (" %%#") do @set %%@ echo %day% echo %DayOfWeek% echo %hour% echo %minute% echo %month% echo %quarter% echo %second% echo %weekinmonth% echo %year% 使用 TYPEPERF一些努力以尽可能快地与不同的语言设置兼容:@echo off setlocal :: 检查 Windows 是否为 Windows XP 并使用 Windows XP 有效的 UDP 性能计数器 ::如果定义了 USERDOMAIN_roamingprofile (set "v=v4" ) else (set "v=") for /f "tokens=4 delims=." %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=" ) 设置“mon=” for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (如果没有定义 mon ( for /f "tokens=1- 7 delims=.:/ " %%a in (%%#) do (set mon=%%a set date=%%b set year=%%c set hour=%%d set minute=%%e set sec =%%f set ms=%%g ) ) ) echo %year%.%mon%.%date% echo %hour%:%minute%:%sec%.%ms% endlocal MSHTA 允许调用类似于上面#3 中演示的 JScript 方法。请记住,涉及月份值的 JavaScript 日期对象属性的编号是从 0 到 11,而不是从 1 到 12。所以值 9 表示十月。