我正在尝试设置一个批处理文件来执行一组存储过程并将输出转储到带有时间戳的文本文件中。我无法找到时间戳的正确格式。
以下是我使用的
osql.exe -S <server> -E -Q "EXEC <stored procedure> " -o "c:\filename_%date:~-0,10%_%time:~-0,10%.txt"
我收到的错误是:
无法打开输出文件 - x:\filename_Thu 06/25/_16:26:43.1.txt 没有此文件或目录
我找不到文档,而且我尝试过但找不到正确的格式。
答案1
: 在 Windows 上的文件名中不是有效字符(与“ \ / * ? < > 和 | 一起),我猜测 %time 的扩展包含用于分隔小时、分钟和秒的 :。
一个可行的办法是将 %time:~0,10% 替换为以下内容:
%time:~0,2%_%time:~3,2%_%time:~6,2%
这假设 %time% 始终采用“hh:mm:ss.ss”格式,我认为这取决于您的语言环境(例如,我的语言环境使用 , 而不是 . 来将秒与 1/100 秒分开)。它应该为您提供类似 hh_mm_ss 而不是 hh:mm:ss 的内容。如果您想要 1/100 秒的第一位数字(如您在原始示例中所见),您可以将最后一个变量扩展更改为采用字符范围 6,4 而不是 6,2。
因此,乍一看,我忽略了文件名中无效的 /,您可能也想删除它们。假设 %date% 的格式为“ddd DD/MM/yyyy”,您可以尝试类似以下操作(我的语言环境与此不同,因此未经测试):
%date:~4,2%_%date:~7,2%_%date:~10,4%
为了测试所有这些,如果您还没有这样做,我建议打开 cmd.exe 并在其中输入“echo %time:~0,2%etc.etc.”来找到适合您语言环境的内容。
最后,需要提醒的是,这基本上假设了一个特定的语言环境,它不太可能移植到不同的语言环境。
答案2
我建议您使用更传统的日期格式,这也有助于轻松排序 - yyyymmddhhmmss。即根本不使用分隔符。当您第一次看到这种格式时,它可能看起来很难阅读,但您可以在大约 2.5 秒内克服这一点。
答案3
如果您想要通用的日期格式,请尝试这个。
for /F "skip=1 tokens=2-4 delims=(-)" %%A in ('echo ^| date') do for /F "Tokens=2-4 Delims=/ " %%X in ('date /t') do set %%A=%%X & set %%B=%%Y & set %%C=%%Z
echo today is %dd%%mm%%yy%
这对于遵循不同日期格式(如 mm/dd/yyyy 或 dd/mm/yyyy)的服务器非常有用。这将始终确保您在变量 mm 中获取月份,在 dd 中获取日期,在 yy 中获取年份