2013-07-02 168 views
2

運行我,如果我在命令提示符下運行它運行良好的批處理文件,但如果它是從任務計劃程序調用或通過瀏覽器運行時會引發錯誤。看起來,FOR邏輯出現語法錯誤。命令的語法不正確,如果不是從CMD線

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

pause 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    pause 
    set tempfile=%%I 
    if exist %tempfile% (
    del car_report.txt 
    ren %tempfile% car_report.txt 
) 
) 

del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 

pause 

如果我跑這從資源管理器或任務計劃,我看到這些文件通過FTP轉移,其次是語法錯誤。如果我通過命令行運行它,我會看到每個正在處理的文件的回顯,最大的文件被複制到更高級別的目錄。

回答

3

即使在命令行中,您的代碼也無法正常工作。

你的問題是你的設置tempfile和擴展%tempfile%在同一個代碼塊內。分析行時該值將展開,並且FOR語句的所有行都將在一次傳遞中解析。因此,您的IF和REN語句會看到循環進入之前存在的值。

您的代碼失敗,語法錯誤時,不定義tempfile。擴展後,IF語句變爲無效:if exist (...,因此是錯誤。

你覺得它在命令行工作的原因是因爲你可能遇到的代碼,一旦它失敗了,但完成的情況下,tempfile變量被設置,因此該腳本會出現運行正常運行它下一次。

通常,我建議使用延遲擴展的,以使設置一個循環內擴大的變量。但是,你沒有任何理由使用tempfile在所有 - 只使用FOR變量直接。

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    if exist "%%I" (
    del car_report.txt 
    ren "%%I" car_report.txt 
) 
) 

del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 

pause 

其實,我不明白爲什麼你需要的,如果在所有的,因爲你的循環只返回現有文件。和所有mic_car * .txt文件將被重新命名爲car_report.txt(最後一個獲勝),所以不應該有任何需要您的最終DEL命令。

您可以組合DEL和REN利用MOVE

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    move /y "%%I" car_report.txt >nul 
) 

copy /y car_report.txt ..\car_report.txt 

pause 
+0

那麼,你有它!它一直在工作,因爲它已經運行了兩次......我從來沒有用過很多批處理文件,這些信息真的很有幫助! –

1

您使用的是哪個版本的Windows?

我已經改變了腳本來調用一個子程序,從您的目錄列表中提取數據。

@echo off 

del mic_car*.txt 

ftp -i -s:car_ftp_script.txt 

pause 

for /F %%I in ('dir /b/os mic_car*.txt') do call :blue %%I 
goto exit 

:blue 
    echo -- processing %1 ------------- 
    pause 
    set tempfile=%1 
    if exist %tempfile% (
    del car_report.txt 
    ren %tempfile% car_report.txt 
    echo -- renamed %tempfile% to car_report.txt ------------- 
) 


del mic_car*.txt 
copy /y car_report.txt ..\car_report.txt 
echo -- finished %1 ------------- 
pause 

goto :eof 

:exit 

有一個在Windows資源管理器和調度之間默認目錄的差異,因爲這個原因,你應該考慮使用到其中的目標文件中找到的文件和目錄顯式路徑。例如刪除C:\ carfiles \ mi_car * .TXT

+0

感謝您的建議,並解釋命令一個命令。 –

0

這些線是你錯誤的原因:

set tempfile=%%I 
if exist %tempfile% (

% - 變量在分析時都expandet,即當命令(在這種情況下for循環)被解釋器解析。此時,循環變量沒有值,所以%tempfile%爲空,從而導致錯誤。

您需要啓用延遲擴展並在循環內部使用! -variables。當循環變量包含實際值時,這些變量會在運行時擴展。

setlocal EnableDelayedExpansion 

for /F %%I in ('dir /b/os mic_car*.txt') do (
    echo %%I 
    pause 
    set tempfile=%%I 
    if exist !tempfile! (
    del car_report.txt 
    ren !tempfile! car_report.txt 
) 
) 
+0

感謝您的信息! –