For循环中if / else语句中的批处理文件设置变量

时间:2013-05-29 19:51:55

标签: for-loop batch-file

我正在尝试创建一个批处理文件,为每个文件生成一个自定义AVIsynth脚本。现在,批处理文件设置为从存在视频文件的文件夹中执行。我需要做的是获取文件的创建时间以生成时间码刻录。我没有问题获取我需要的信息。但是,如果文件是在下午创建的,我需要在24小时内完成。例如,下午2点需要显示为14.

我有一个工作if语句创建一个newth变量,如果需要可以添加12。但是,如果它不需要它,变量仍然存在。在循环的每次后续迭代中,变量都不会改变。

我的例子。我有两个文件,第一个是在下午2点创建的,另一个是在中午12点。首先读取2pm文件,newth变量变为14.到目前为止一直很好。在下一个文件中,newth变量应该变为12,但仍然是14.如何解决此问题?

@Echo Off & CLS
SetLocal EnableDelayedExpansion
For /F %%a In ('dir *.mpg /b') Do (
    ECHO Processing "%%a"
    echo %%~ta
    set time=%%~ta
    set th=!time:~11,2!
    set tm=!time:~14,2!
    set era=!time:~17,2!
    echo !era!
    if "!era!"=="PM" (
        if !th! LSS 12 ( set /a newth=!th!+12 )
    ) else ( set /a newth=!th!)

    echo !newth!
    echo //AviSynth Test Script >scripts/%%a.avs
    echo DirectshowSource^("%%~fa"^)>>scripts/%%a.avs
    echo LanczosResize^(720,400^) >>scripts/%%a.avs
    echo ShowSMPTE^(^) >>scripts/%%a.avs

    ECHO Back to Console
    Pause
)

这有点乱,因为我一直在使用echo进行调试。但希望问题很清楚。

3 个答案:

答案 0 :(得分:1)

这是Wmic的一种方法 - Wmic在XP专业版及以上版本。

@Echo Off & CLS
SetLocal EnableDelayedExpansion
For /F "delims=" %%a In ('dir *.mpg /b') Do (
    ECHO Processing "%%a"

    set "file=%cd%\%%a"
    set "file=!file:\=\\!"
    WMIC DATAFILE WHERE name="!file!" get creationdate|find ".">file.tmp
    for /f %%a in (file.tmp) do set dt=%%a
    set tm=!dt:~8,2!:!dt:~10,2!:!dt:~12,2!
    del file.tmp
    echo !tm!
    echo //AviSynth Test Script >scripts/%%a.avs
    echo DirectshowSource^("%%~fa"^)>>scripts/%%a.avs
    echo LanczosResize^(720,400^) >>scripts/%%a.avs
    echo ShowSMPTE^(^) >>scripts/%%a.avs

    ECHO Back to Console
    Pause
)

答案 1 :(得分:1)

您的代码存在一些问题。主要的一个是这个序列

if "!era!"=="PM" (
    if !th! LSS 12 ( set /a newth=!th!+12 )
) else ( set /a newth=!th!)

第一个文件时间“02:xx PM”
th = 02,era = PM,因此set /a newth=02+12设置newth = 14

第二个文件时间为“12:xx PM”
th = 12,era = PM,所以 - 什么都不做,因为else

没有!th! LSS 12行动

因此,newth仍为14。

那么 - 解决方法是什么?由于您未进一步使用newth,我们无法确定,但您似乎需要24小时格式 - 4位hhmm

危险,威尔罗宾逊时刻1:
您正在处理由LEADING ZEROES主演的数字。一切都很好,除非价值为0809,哪一批从开始0开始奇怪地解释为OCTAL。

危险,威尔罗宾逊时刻2:
set /a会取消前导零,因此set /a newth=!th!会将newth设置为7一段时间07:36 AM - 而不是07 ...

那么 - 如何克服这一切?

IF !th!==12 SET th=00
SET th=!th: =0!
if "!era!"=="PM" (set /a newth=1!th!+12
 SET newth=!newth:~-2!
) else ( set newth=!th!)

这会强制12 AM00 AM12 PM00 PM
然后将spaces替换为0(如果您有前导空格,而不是零) 然后,如果eraPM,请在1小时编号前加2-digit添加100,添加12并抓取最后2个字符
否则,只需使用th

中的数字

不幸的是,由于您没有告诉我们您使用或不使用时间格式的前导零,因此更复杂一些。然而,原始计算方法不完整是错误的。

危险,威尔罗宾逊时刻3:
time是一个 MAGIC VARIABLE - 你知道what happened to Mickey当他更好地参与其中的事情时。

如果您批量设置time,则%time%!time!将返回您设置的值。如果未设置,则返回的值将是系统时间。同样适用于DATE和许多类似的值(请参阅提示中的set /? - 最后有一个列表)

答案 2 :(得分:0)

这里是你如何获得时间戳的时间:

C:\>powershell -command "& {(gwmi -query """select * from cim_datafile where name = 'C:\\file.txt' """).lastModified;}"

C:\>powershell -command "& {(gwmi -query """select * from cim_datafile where name = 'D:\\other.txt' """).creationdate;}"

我已尝试使用WMIC但仍无法获得时间戳。如果您使用的是Win7,则默认情况下应安装PowerShell。