2012-09-20 88 views
0

我試圖運行批處理腳本,該腳本將查找特定文件的最後修改日期。我使用類似於下面的腳本的內容:批處理腳本獲取遠程文件的最後修改日期

@echo off 

set mainDir=\\subdomain.myintranet.net\c$ 
set txtFile=%mainDir%\tmp.txt 
set txtFile2=%mainDir%\tmp2.txt 
set "bodyText=^<p^>Hello,^<br /^>^<br /^>" 

if exist %txtFile% (
    for %%X in (%txtFile%) do (set fileDate=%%~tX) 
    set "bodyText=%bodyText%tmp.txt file updated as of %fileDate%^<br /^>" 
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>" 
) 

if exist %txtFile2% (
    for %%X in (%txtFile2%) do (set fileDate2=%%~tX) 
    set "bodyText=%bodyText%tmp2.txt file updated as of %fileDate2%^<br /^>" 
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>" 
) 

set "bodyText=%bodyText%^</p^>" 

echo %bodyText% > %mainDir%\mylog.txt 

測試此示例代碼的時候,我發現它有時工作,有時沒有。發生什麼事是它找到了該文件,但fileDate變量回到空白。

我也嘗試在腳本的開頭放置一個空變量fileDate=,但那不起作用。

如果很重要:我已將批處理腳本連接到每日運行的SQL Server 2000作業。批處理文件和日誌文件駐留在數據庫所在的服務器上,但批處理腳本完全限定文件位置,如我在示例中所示(這是因爲如果我想從我的桌面運行批處理文件,它將檢查/更新正確的文件)。

由於提前, 約瑟夫

編輯:

輸出應該是這樣的:

Hello, 

tmp.txt file updated as of 9/19/2012 2:24 PM 
tmp2.txt file updated as of 9/19/2012 10:02 AM 

雖然我有時得到的是:

Hello, 

tmp.txt file updated as of 
tmp2.txt file updated as of 

而且其他時間我米ay得到:

Hello, 

tmp.txt file updated as of 9/19/2012 2:24 PM 
tmp2.txt file updated as of 

弄清楚發生了什麼問題很混亂。

回答

3

呻吟......

這一定是與Windows批量開發中最常見的錯誤。您正試圖擴展在同一代碼塊中設置的變量。但是,當整個代碼塊被解析時,變量會被擴展,所以您將獲得在執行代碼塊之前存在的值。這顯然不起作用。

從命令提示符下輸入HELP SETSET /?並閱讀有關延遲擴展的章節。這顯示了你解決問題的一種方法。

但在你的情況下,你根本不需要變量,所以你不需要延遲擴展。

@echo off 

set mainDir=\\subdomain.myintranet.net\c$ 
set txtFile=%mainDir%\tmp.txt 
set txtFile2=%mainDir%\tmp2.txt 
set "bodyText=^<p^>Hello,^<br /^>^<br /^>" 

if exist %txtFile% (
    for %%X in (%txtFile%) do set "bodyText=%bodyText%tmp.txt file updated as of %%~tX^<br /^>" 
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile%.^<br /^>" 
) 

if exist %txtFile2% (
    for %%X in (%txtFile2%) do set "bodyText=%bodyText%tmp2.txt file updated as of %%~tX^<br /^>" 
) else (
    set "bodyText=%bodyText%Warning: Issues finding %txtFile2%.^<br /^>" 
) 

set "bodyText=%bodyText%^</p^>" 

echo %bodyText% > %mainDir%\mylog.txt 


編輯

有是爲了簡化,應該使代碼更易於維護很多更多的空間:簡單直接,當您添加到您的bodyText的使用FOR變量。由於您正在準備HTML文件,因此沒有理由擔心會出現額外的換行符,因此您不必將所有文本放入一個變量中。您可以使用多個ECHO語句。我會構建你的代碼如下所示(未經測試,但概念是健全的):

@echo off 
setlocal 
set "mainDir=\\subdomain.myintranet.net\c$" 
set "br=^<br /^>" 
set "p=^<p^>" 
set "/p=^</p^>" 
>"%mainDir%\mylog.txt" (
    echo %p%Hello,%br%%br%" 
    for %%F in (
    "%mainDir%\tmp.txt" 
    "%mainDir%\tmp2.txt" 
) do (
    if exist %%F (
     echo %%~nxF file updated as of %%~tF%br%" 
    ) else (
     echo Warning: Issues finding %%~nxF.%br%" 
    ) 
    echo %/p% 
) 
+0

感謝您的解釋!在閱讀你的解釋和變量的延遲擴展信息之後,這更有意義。並感謝關於簡化代碼的說明。我對我的製作腳本做了非常類似的更改,並且效果很好。再次感謝! –

相關問題