2

我正在尝试创建一个批处理文件,为每个文件生成一个自定义 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调试。但希望问题很清楚。

4

3 回答 3

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-hour format - 4 digit hhmm

危险,威尔罗宾逊时刻 1 号:
您正在处理以 LEADING ZEROES 为主角的数字。一切都很好,除了值是08or 09,它从一开始就奇怪地解释为 OCTAL 0

危险,Will Robinson时刻 2:
set /a将抑制前导零,因此set /a newth=!th!将设置newth7时间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 AMto00 AM12 PMto00 PM
然后替换任何spaces0(如果你有前导空格,而不是零)
然后,如果era是,则在小时数之前通过字符串PM添加 100 ,添加 12 并获取最后 2 个字符 否则,只需使用中的数字12-digit
th

不幸的是,由于您没有告诉我们您是否在时间格式中使用前导零,所以这有点复杂。然而,不完整的原始计算方法是错误的。

危险,威尔罗宾逊时刻 3:
time是一个神奇的变量——你知道米奇在参与最好的事情时发生了什么。

如果time是批量设置,那么%time%or!time!会返回你设置的值。如果不设置,则返回的值为系统时间。相同的DATE值和许多相似的值(set /?从提示中查看 - 最后有一个列表)

于 2013-05-30T04:42:52.423 回答
1

这是 Wmic 的一种方法 - Wmic 在 XP pro 及更高版本中。

@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
)
于 2013-05-30T02:07:28.117 回答
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。

于 2013-05-29T21:35:36.633 回答