0

目标:设置两个选项来更改然后恢复日期,具体取决于哪个选项有效。

背景:用于 2005 年过时的 Windows p2p 应用程序;公司于 2006 年关闭。此版本可在有限时间内免费下载和使用。因此,日期需要在它启动之前改回几秒钟。有很多人使用这个程序。即:这是一个社区项目。

这个项目的历史: 一种技术 (%BEFOREDATE%) 适用于 Win 2K 到 Windows 7。另一种技术 (%CURDATE%) 适用于 Windows 8 但不是更早。最近有人注意到第一种技术确实适用于他们的 Win 8,但不是 %CURDATE%,这与我的 Win 8 相反。

我发现将日期恢复到今天会产生某种错误,即使它成功将其发送到错误处理部分(错误处理程序退出进程。无论如何基本上与 EXIT 相同。)

当错误的选项运行程序/脚本时,它就会挂起。

如何正确编写它以便它处理任一选项并且如果遇到不适用于该特定系统的选项则不会挂起?我不知道日期正确更改时会产生什么错误。

处理 Win 8 选项的代码部分:

:ver_8
SET BEFOREDATE=%date:~4,2%-%date:~7,2%-%date:~10,4%
FOR /F "TOKENS=1* DELIMS= " %%E IN ('DATE/T') DO SET CURDATE=%DATE%
DATE 07-01-05
@echo off
PING -n 5 127.0.0.1 > NUL 2>&1
@echo off
DATE %BEFOREDATE%
ping -invalid-arg || goto :ver_2
goto exit

:ver_2
DATE %CURDATE%
ping -invalid-arg || goto :error
goto exit
4

3 回答 3

1

较早的解决方案如下。

这个解决方案并不聪明,但应该适用于大多数语言环境。具有不同日期格式的人可以在该行下方复制另一行:

if not "%format:mm-dd-yy=%"=="%format%" set olddate=07-14-2005

并将 mm-dd-yy 更改为批处理文件在其不同区域设置中报告的内容以及与之匹配的静态日期格式。

@echo off
for /f "delims=" %%a in ('echo.^|date^|find /i "current"') do set "d8=%%a"
for /f "delims=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz: " %%a in ("%d8%") do set "d8=%%a"
for /f "delims=" %%a in ('echo.^|date^|find /i "Enter"') do set "format=%%a"
set olddate=

echo if this fails then add another line in the batch file and change the mm-dd-yy
echo to what you see at the at the end of this line below
echo %format% ^<---- here

if not "%format:dd-mm-yy=%"=="%format%" set olddate=14-07-2005
if not "%format:mm-dd-yy=%"=="%format%" set olddate=07-14-2005

:: to add a locale duplicate the line above and change the mm-dd-yy and static date as needed

date %olddate%

start "" "c:\folder\launch program.exe"

timeout /t 5 /nobreak
date %d8%
pause

原解决方案如下:

这适用于 Windows 8 英语。
它将日期设置为 xx05 年的今天,并启动程序并将日期再次重置为今天。

如果您想要 2005 年的静态日期,请更改date %d8:~0,-2%05日期格式,但日期格式将成为各种语言环境的一个因素 - 但此批处理文件确实希望年份是日期字符串中的最后一位数字。

@echo off
for /f "delims=" %%a in ('echo.^|date^|find /i "current"') do set "d8=%%a"
for /f "delims=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz: " %%a in ("%d8%") do set "d8=%%a"
date %d8:~0,-2%05

start "" "c:\folder\launch program.exe"

timeout /t 5 /nobreak
date %d8%
于 2013-07-12T18:59:43.620 回答
0

一些注意事项:

这是以 mm-dd-yyyy 格式保存日期(请注意,某些版本的 Windows Date 命令采用 mm-dd-yy 格式)

SET BEFOREDATE=%date:~4,2%-%date:~7,2%-%date:~10,4%

尝试将其更改为

SET BEFOREDATE=%date:~4,2%-%date:~7,2%-%date:~12,2%

如果您只是将 CurDate 设置为 Date,那么 for 循环的意义何在?

FOR /F "TOKENS=1* DELIMS= " %%E IN ('DATE/T') DO SET CURDATE=%DATE%
于 2013-07-12T14:10:44.607 回答
0

如果您不是机器的“管理员”,则需要“以管理员身份运行”来设置日期。请注意,仅作为管理员是不够的。

于 2013-07-12T13:43:29.583 回答