2011-06-26 21 views
3

Windows XPバッチファイルでは、FTPディレクトリリストを取得して、For /Fループで処理しています。ファイル名を含む最後のトークンは、変数の最後の文字としてキャリッジリターン(0D)で終わります。キャリッジリターンによって私のIfステートメントが行の先頭に折り返されるので、トークンの値を使用しようとすると失敗します。環境変数 - XPコマンドラインからキャリッジリターンを取り除く

ftp> dir 
200 PORT command successful. 
150 Opening ASCII mode data connection for /bin/ls. 
01-04-10 10:00AM    93882 Logo.jpg 
02-05-10 11:01PM  <DIR>   PCODE 
03-06-10 12:02PM    42333443 Saved stuff.zip 
04-07-10 12:42PM    49343848 Stuff.zip 
226 Transfer complete. 

検査時に進エディタを使用して、各ラインではなく単に0D 0Aで、0D 0D 0Aで終了:

@echo off 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    if 'Stuff.zip'=='%%B' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

処理すべき内容は以下の通りです。余分な0Dがなぜそこにあるのか分かりませんが、私のプログラムが機能するためにそれを削除する必要があります。

%% BはStuff.zipに等しい実行中に、Ifは次のようになります。

' Set ReleaseDate=04-07-10) 'Stuff.zip 

(if 'Stuff.zip'=='Stuff.zip' Set ReleaseDate=04-07-10) 

Ifラインが原因CRのこのように見える終わります039キャリッジリターンが処理されると、(if 'Stuff.zip'=='Stuff.zipが上書きされます。

環境変数の最後に余分な0Dを取り除くにはどうすればよいですか?

答えて

2

コードラインが好奇心に見えても、正常に動作します。
あなたのケースでは、<CR>を削除する方法は複数あります。

最初と最も簡単な方法 - パーセント展開フェーズの後で特殊文字フェーズの前にパーサーがすべて<CR>文字を削除するので、バッチパーサーを使用します。感嘆符がように引用符をマークし、同じよう

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 
goto :eof 

:removeCR 
set "fileName=%fileName%" 
goto :eof 

しかし、一般的に、このソリューションは、特殊文字を含むいくつかの問題を引き起こす可能性があります。

もう1つの方法は、<CR>を空の文字列に置き換えることです。進エディタで0x0Dをに変更する必要がありますset "fileName=%fileName:<CR>=%"ラインで

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

:removeCR 
set "fileName=%fileName:<CR>=%" 
goto :eof 

<CR>。 しかし、このソリューションは、最初のソリューションと同じ特殊文字の問題があり、通常のテキストエディタでは作成できません。

最後の解決策は、単一の<CR>を作成し、遅延拡張を伴う:removeCR機能で使用します。
このソリューションは、感嘆符を除くすべての特殊文字に対して安全です。

@echo off 
setlocal EnableDelayedExpansion 
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 

for /f "tokens=1,4 delims=" %%A in ('ftp -s:dir.ftp') do (
    set "fileName=%%B" 
    call :removeCR 
    if 'Stuff.zip'=='!fileName!' Set StuffDate=%%A 
    ) 
echo Stuff.zip was saved on %StuffDate%. 

:removeCR 
for %%a in ("!CR!") do (
    set "fileName=!fileName:%%~a=!" 
) 
goto :eof