我正在尝试创建一个批处理文件,为每个文件生成一个自定义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
进行调试。但希望问题很清楚。
答案 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主演的数字。一切都很好,除非价值为08
或09
,哪一批从开始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 AM
到00 AM
和12 PM
到00 PM
然后将spaces
替换为0
(如果您有前导空格,而不是零)
然后,如果era
为PM
,请在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。