2012-03-14 92 views
0

我手邊的問題是下載pdf文件並將它們全部發送到打印機。批處理打印 - 批處理腳本 - fortr循環中的findstr條件

我通過FTP下載正確的所有文件進入我的本地目錄:然後

文件名= FtpScript.ftp

open ftp.domain.com 
username 
password 
!:--- FTP commands below here --- 
lcd local/Directory 
cd /remote/Directory 
binary 
mget "*.pdf" 
prompt 
disconnect 
quit 

此批處理文件調用FTP腳本。

文件名= retrieve_print.bat

@ftp -i -s:"C:\Scripts\FtpScript.ftp" 

set mm=%date:~4,2% 
set dd=%date:~7,2% 
set yy=%date:~-4% 

IF NOT EXIST {C:\Users\print_test2\print_%mm%_%yy%}(mkdir C:\Users\print_test2\print_%mm%_%yy%) 

IF NOT EXIST C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt ( 
    @echo Uploaded Text -- Date: %date% Time : %time% >>  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
) 
IF NOT EXIST  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt ( 
    @echo Printed Text -- Date: %date% Time : %time% >>  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
) 

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND INSERT THE NAMES INTO THE UPLOADED_*_*.txt TEXT  FILE 
FOR %%x in ( C:\Users\print_test2\print_%mm%_%yy%\*.pdf) DO  (
    findstr "%%~nxx"  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
    @ECHO Error level = %errorlevel% 
    @ECHO %%~nxx 
    @pause 
    IF NOT %errorlevel% == 0 (
     @echo %%~nxx >>  C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt 
    ) 
) 

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND PRINT THEM, THEN INSERT THEM INTO THE PRINTED_*_*.txt TEXT FILE TO SUPPRESS DUPLICATE PRINTS 
FOR %%x in ( C:\Users\print_test2\print_%mm%_%yy%\*.pdf) DO  (
    findstr "%%~nxx"  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
    @ECHO Error level = %errorlevel% 
    @ECHO %%~nxx 
    IF NOT %errorlevel% == 0 (
     rem PRINT FUNCTION 
     @echo %%~nxx >>  C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
    ) 
) 

的文本文件產生不正確。我的想法是,我可以通過print_test2/print_%mm%_%yy%目錄中可用的文件遍歷通過ftp接收的所有文件並將其記錄到文本文件中。

當我嘗試在文本文件中有文件名時再次運行腳本時,問題就變得很明顯。我期望findstr函數返回%errorlevel%爲0,但它不檢測文本文件中的字符串,並在我上傳和打印的文本文件中再次附加所有文件名。

是否有更好的方式記錄收到的文件並只打印一次pdf?

感謝

回答

3

你的問題是,%errorlevel%值取裏面的,所以它是由價值ERRORLEVEL取代了之前進入for循環。採取當前值ERRORLEVEL在每個迭代必須使用變量延遲擴展有,即,請用感嘆號的值,而不是百分比:!errorlevel!和在程序的begining插入此行:

setlocal EnableDelayedExpansion 

爲了使這個問題更清楚,試試這個:

set name=Value before FOR 
for %%f in (*.pdf) do (
    set name=%%f 
    echo %name% 
) 

,然後再次嘗試通過改變echo !name!echo %name%

+0

花了一些時間與此循環,並不知道發生了什麼事情。這完全解決了我的錯誤。謝謝你的幫助Aacini。 – Alex 2012-03-14 19:18:20

0

有一些想法,認爲:

  1. 我不知道你的FINDSTR命令後,錯誤級別將是僅僅因爲未找到字符串非零。
  2. 即使errorlevel不爲零,我認爲執行下一個命令的那一刻,該命令的新錯誤級別就會被設置。
  3. 在您的IF語句中,您可能需要將平等檢查的兩邊用分隔符分隔。 IF NOT "%errorlevel%" == "0"
  4. 您可能會考慮在您將所有文件名回顯後將列表分隔開來。它會爲你節省一些邏輯。在DOS中有一些使列表不同的代碼在這裏描述:http://www.dullsharpness.com/2010/10/01/create-a-distinct-ordered-list-from-an-unordered-duplicate-list-using-ms-dos/
  5. 如果你使用#4的技術,你可以在你的文件中做一個目錄列表(如接下來),然後在#4中使用獨特的使用技巧。

dir/b C:\Users\print_test2\print_%mm%_%yy%\*.pdf >> C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt

+0

1.是的,如果未找到該字符串,FINDSTR將返回一個非零的錯誤級別值。 2.在.BAT文件中,ECHO和PAUSE命令不會修改錯誤級別。 3.比較錯誤級別值時,不需要分隔符,只有當值可能包含空格或其他特殊字符時。 – Aacini 2012-03-14 03:05:06

+0

Hey Marc,4中的技巧很好地解釋了setlocal EnableDelayedExpansion。特別是使用http://www.robvanderwoude.com/variableexpansion.php。謝謝! – Alex 2012-03-14 19:26:56