2012-03-14 33 views
0

私の手元にある問題は、pdfファイルをダウンロードしてそれらをすべてプリンタに送ることです。バッチ・プリント - バッチ・スクリプト - forループの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 
    ) 
) 

。私は、ftp経由で受け取ったすべてのファイルに対して、print_test2/print_%mm%_%yy%ディレクトリにあるファイルをループして、テキストファイルに記録できると考えました。

テキストファイルにファイル名が含まれているときにスクリプトをもう一度実行しようとすると、問題が明らかになります。 findstr関数は%errorlevel%を0に戻すことを期待していますが、テキストファイルにある文字列は検出されず、アップロードされたテキストファイルと印刷されたテキストファイルの両方にすべてのファイル名が再度追加されます。

受信したファイルをログに記録し、pdfsを1回だけ印刷するより良い方法はありますか?

おかげ

答えて

3

あなたの問題は%errorlevel%値がため内側に取られているので、それは価値のERRORLEVELに置き換えられ前がループのために入力していたということです。!errorlevel!をして、プログラムの初めに次の行を挿入します:あなたが遅れ変数の拡張を使用する必要がありますの反復のそれぞれでを持ってERRORLEVEL 現在値を取るために、つまり、感嘆符の値が代わりにパーセント囲み

setlocal EnableDelayedExpansion 

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

をしてからecho !name!echo %name%を変更し、再試行してください:

は、この問題をより明確にするために、これを試してみてください。

+0

このforループでしばらく時間を費やし、何が起こっていたのか分からなかった。これは私のエラーを正確に修正しました。助けてくれてありがとうAacini。 – Alex

0

考慮すべきいくつかのアイデア:

  1. 私はあなたのFINDSTRコマンドの後ERRORLEVELは文字列が見つからなかったという理由だけで、非ゼロであることを行っていることはよく分かりません。
  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

+0

Hey Marc、4のテクニックでは、setlocal EnableDelayedExpansionについてよく説明しています。特にhttp://www.robvanderwoude.com/variableexpansion.phpで。ありがとう! – Alex