如何判断Batch变量是文本还是数字?

时间:2014-08-22 14:55:09

标签: windows batch-file cmd scheduled-tasks windows-server-2012

这是一个非常简单的事情,我有一个可怕的时间搞清楚。

我有一个脚本。它将日期分解为单独的变量,如下所示:

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是否是一个数字,但我无法弄清楚如何检查这个。我已经在这里搜索了旧的博客和问题,但我已经空了。有人可以帮忙吗?

5 个答案:

答案 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生成错误并从输出中检索日期/时间