这是一个非常简单的事情,我有一个可怕的时间搞清楚。
我有一个脚本。它将日期分解为单独的变量,如下所示:
for /f "tokens=1,2,3,4 delims=/ " %%a in ( 'DATE /T' ) do set DD=%%a&set MM=%%b&set YYYY=%%c
for /f "tokens=1,2,3,4 delims=:." %%e in ("%time%") do set HH=%%e&set MI=%%f&set SS=%%g
这在cmd中很棒!直到我使脚本成为计划任务。当它是预定任务时,DATE /T
中的第一个标记是日名称(如周一,周二,周三等)。问题是我需要它作为日期,而不是日期
对我来说,这应该是一个简单的if语句来检查%%A
是否是一个数字,但我无法弄清楚如何检查这个。我已经在这里搜索了旧的博客和问题,但我已经空了。有人可以帮忙吗?
答案 0 :(得分:2)
您可以尝试将变量设置为数字:
set /a x=TUE
id "%x%"="0" echo this is not a number
但我建议使用独立于语言的解决方案:
for /f %%i in ('wmic os get localdatetime^|find "."') do set x=%%i
set YYYY=%x:~0,4%
set MM=%x:~4,2%
set DD=%x:~6,2%
set HH=%x:~8,2%
set MI=%x:~10,2%
set SS=%x:~12,2%
或者,如果您不介意使用其他变量名称和缺少前导0
(如{8}的8
而不是08
):
for /f %%i in ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /value ^|find "="') do set %%i
并获取
Day=22
Hour=17
Minute=19
Month=8
Second=12
Year=2014
答案 1 :(得分:1)
当代码可以在不同的机器上运行时,日期变量是不可靠的。
此代码的前四行将为您提供XP Pro及更高版本中可靠的YY DD MM YYYY HH Min Sec变量。
@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
答案 2 :(得分:1)
回答您的原始场景,让您考虑字符串是文本还是数字 - 最好使用wmic代码来确定窗口中的日期和时间,因为它返回ISO标准中的值,并且无论区域设置如何都是相同的。下面是代码。
for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do set TS=%%x
set yyyy=%TS:~0,4%
set mm=%TS:~4,2%
set dd=%TS:~6,2%
set hh=%TS:~8,2%
set min=%TS:~10,2%
set timestamp=%dd%-%mm%-%yyyy%_%hh%-%min%
echo %timestamp%
在此回答您的问题 - 以下内容可帮助您了解如何查找变量是文本或数字。
@echo off
setlocal enabledelayedexpansion
for /f %%i in (input.txt) do (
(echo.%%i | findstr /i [a-z] >nul) || (echo.%%i | findstr /i [0-9] >nul) && echo.%%i is a number
(echo.%%i | findstr /i [0-9] >nul) || (echo.%%i | findstr /i [a-z] >nul) && echo.%%i is a text
(echo.%%i | findstr /i [0-9] >nul) && (echo.%%i | findstr /i [a-z] >nul) && echo.%%i is a text and number
)
示例(已测试)输出 -
D:\Scripts>type input.txt
1234
abcd
123abc
Hello world
12345
welcome
we1c0me
D:\Scripts>draft.bat
1234 is a number
abcd is a text
123abc is a text and number
Hello is a text
12345 is a number
welcome is a text
we1c0me is a text and number
干杯,G
答案 3 :(得分:0)
首先,我怀疑您遇到区域设置差异。您的计划任务可能在不同的帐户中运行,具有不同的设置。 (当我从CMD运行时,我的系统首先获得了日期名称。)即使您在一周的某一天被剥离,您可能会遇到数字顺序的问题(例如,我的是MM-DD-YYYY)。
那就是说...如果你只是想跳过星期几的文本,对你的脚本的绝对最简单的改变如下:
for /f "tokens=1,2,3,4 delims=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ " %%a in ('DATE /T') do set DD=%%a&set MM=%%b&set YYYY=%%c
for /f "tokens=1,2,3,4 delims=:." %%e in ("%time%") do set HH=%%e&set MI=%%f&set SS=%%g
这只是将所有(英文)字母字符视为分隔符,因此FOR命令可以快速跳过它们。
更直接地回答您的问题:如果您想检查一个值是否为数字,您可以尝试这样的事情:
set VAL_TO_TEST=...
set /a VAL=%VAL_TO_TEST%+0
if "%VAL%"=="%VAL_TO_TEST%" echo VAL_TO_TEST is a number
这依赖于SET的相当松散的表达式解析(它通常将它能够解析为零的任何东西)。如果输入字符串格式奇怪(额外的空白等),你可能会遇到这种技术的问题,但这不是这里的情况。
答案 4 :(得分:0)
set "yyyy=" & for /f "tokens=1-6 delims=/: " %%a in (
'robocopy "|" . /njh /nocopy /l'
) do if not defined yyyy (
set "yyyy=%%a" & set "mm=%%b" & set "dd=%%c"
set "hh=%%d" & set "nn=%%e" & set "ss=%%f"
)
echo %yyyy% %mm% %dd% %hh% %nn% %ss%
这使用robocopy
生成错误并从输出中检索日期/时间