2013-05-29 119 views
2

我試圖創建一個批處理文件,該文件爲每個文件生成一個自定義AVIsynth腳本。現在批處理文件被設置爲從視頻文件所在的文件夾中執行。我需要做的是獲得文件的創建時間以生成時間碼刻錄。我沒有問題獲取我需要的信息。但是,如果該文件是在下午創建的,我需要它在24小時內。例如,下午2點需要顯示爲14.For循環中的if/else語句中的批處理文件設置變量

我有一個工作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

你試過用'if/i'!era!「嗎? ==「PM」' – npocmaka

+0

謝謝,但這並不能解決我遇到的問題。問題是,如果'newth'存在於前一個循環中,它將不會切換回else部分中的'!th!'。因此,保持以前迭代的價值。 – user2433986

+0

什麼是您的操作系統?有更多的方法來獲得時間... – npocmaka

回答

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,但還是不能讓stamp.As你正在使用的Win7,你應該在默認情況下安裝了PowerShell的時間。

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 
) 
+0

Aaah。我試過的。+ 1 – npocmaka

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+12newth = 14

隨着你的第二個文件時間「12: XX PM」
th = 12,era = PM,所以 - 什麼都不做,因爲沒有else行動!th! LSS 12

因此,newth保持在14.

那麼 - 什麼是修復?由於您進一步不使用newth,我們不能肯定地說,但它似乎要24小時格式 - 4位hhmm

危險,威爾·羅賓遜時刻數1:
你正在處理數主演的前導零。除了數值爲0809之外,所有這一切都很好且很好,自從它開始0以來,該批次奇怪地解釋爲OCTAL。

危險,威爾·羅賓遜時刻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!) 

這迫使由前串起112 AM00 AM12 PM00 PM
然後替換0任何spaces(如果你有前導空格,而不是零)
然後,如果eraPM,加100 2-digit小時數,加12並抓住最後2個字符
否則,只使用th中的數字

不幸的是,由於您沒有告訴我們您是否在時間格式中使用或不使用前導零,所以稍微複雜一點。然而,不完整的原始計算方法存在錯誤。

危險,威爾·羅賓遜時刻3號:
timeMAGIC變 - 你知道what happened to Mickey時,他被捲入了事情做得更好單獨留在家中。

如果您批量設置了time,那麼%time%!time!將返回您設置的值。如果你沒有設置它,那麼返回的值將是系統時間。 DATE和一些相似的值(見提示中的set /? - 最後有一個列表)

相關問題