0

ファイルのリストの CSV ファイルを読み取り、それらを FTP サーバーにアップロードするスクリプトを作成しました。CSV 構造は次のようになります。

local_file,remote_file

このスクリプトは、必要なすべての FTP コマンドを含むテキスト ファイルを作成し、FTP コマンドを実行します。for ループがそのコマンドの外部にあるコードを実行することを除いて、すべてが機能します。つまり、以下のすべてecho put "%1" "%2" >> %Commands%がすべての for ループでも実行され、すべての put コマンドを含む適切にフォーマットされたファイルを取得する代わりに、これを取得します (コマンドファイルから)出力):

open servername 
username 
password 
binary 
put "local_path_to\first_file_on_the_list.php" "remote_path_to\first_file_on_the_list.php" 
close 
bye   
put "-d" "-i" 
close 
bye   
put "-d" "-i" 
close 
bye   
put "-d" "-i" 
close
...

スクリプトコードは次のとおりです。

@echo off
setlocal EnableExtensions

rem Connection credentials
set Server=servername
set UserName=username
set Password=password

set Commands="commands.txt"
echo open %Server% > %Commands%
echo %UserName% >> %Commands%
echo %Password% >> %Commands%
echo binary >> %Commands%

rem Read the CSV file line by line
for /f %%a in (matches3.csv) do call :parse %%a

rem Transform CSV line into FTP put commmand
:parse
echo put "%1" "%2" >> %Commands%

:end
rem Add commands to close ftp conn
echo close >> %Commands%
echo bye   >> %Commands%

rem Perform the FTP upload
echo loggin in to ftp...
FTP -d -i -s:%Commands% %Server%
echo finished.
pause

rem Clean up.
if exist %Commands% del %Commands%
endlocal
exit

:end 以下のすべてが実行される理由がわかりません! 事前にどうもありがとうございました

4

3 に答える 3

2

:end以下のコードを実行してはいけないのはなぜですか? :parse ルーチンを終了するスクリプトには何も入れません。

FOR ステートメントの後に GOTO :END が必要な場合を除いて、最初の ewall の回答はほとんど機能するはずです。彼の提案を適切に実装すると、無限ループが発生する可能性があることがわかりません。

もう 1 つのオプションは、サブルーチンを EXIT ステートメントの後に移動することです。

他にも隠れた問題があります。ファイル パス/名前にはスペースを含めることができるため、スペースがある場合、既定の FOR 区切り文字のスペース、タブでは行全体が保持されません。デフォルトの EOL では、 で始まる行も;無視されます。有効なファイル名は;.

解決策は、有効なファイル仕様を開始できない文字に EOL を設定し、DELIMS を何も設定しないことです。"EOL=: DELIMS="

すべてのファイル書き込み行を括弧で囲み、出力を一度だけリダイレクトする方がはるかに効率的です。書きやすく、見栄えも良くなります。

編集 - 元のスクリプトは、ftp スクリプトと ftp コマンド ラインの両方でサーバーに接続しようとしていました。いずれかを削除する必要がありました。ftp スクリプトから削除しました。

@echo off
setlocal EnableExtensions

rem Connection credentials
set Server=servername
set UserName=username
set Password=password

set Commands="commands.txt"
(
  echo %UserName%
  echo %Password%
  echo binary

  rem Read the CSV file line by line
  for /f "eol=: delims=" %%a in (matches3.csv) do call :parse %%a

  rem Add commands to close ftp conn
  echo close
  echo bye
)>%Commands%

rem Perform the FTP upload
echo logging in to ftp...
FTP -d -i -s:%Commands% %Server%
echo finished.
pause

rem Clean up.
if exist %Commands% del %Commands%
endlocal
exit

rem Transform CSV line into FTP put commmand
:parse
echo put "%1" "%2"
于 2012-05-30T15:57:23.270 に答える
0

は関数:endの実行を停止しません。これは単なるラベルです。代わりに、 for ループに戻る を使用するつもりだったのではないかと思います。CALLGOTO :eof

...
rem Read the CSV file line by line
for /f %%a in (matches3.csv) do call :parse %%a

rem Transform CSV line into FTP put commmand
:parse
echo put "%1" "%2" >> %Commands%

goto :eof

rem Add commands to close ftp conn
...

または、呼び出しを使用するよりも、次のように括弧を使用する方がはるかに簡単であることがわかる場合があります。

...
rem Read the CSV file line by line
for /f %%a in (matches3.csv) do (
  rem Transform CSV line into FTP put command
  echo put "%%a" "%%b" >> %Commands%
)

rem Add commands to close ftp conn
...
于 2012-05-30T13:43:19.347 に答える
0

多分これはうまくいく

@echo off
setlocal EnableExtensions

rem Connection credentials
set Server=servername
set UserName=username
set Password=password

set Commands="commands.txt"
echo open %Server% > %Commands%
echo %UserName% >> %Commands%
echo %Password% >> %Commands%
echo binary >> %Commands%

rem Read the CSV file line by line
for /f %%a in (matches3.csv) do call :parse %%a

rem Transform CSV line into FTP put commmand
:parse
echo put "%1" "%2" >> %Commands%

:end
rem Add commands to close ftp conn
echo close >> %Commands%
echo bye   >> %Commands%

rem Perform the FTP upload
echo loggin in to ftp...
FTP -d -i -s:%Commands% %Server%
echo finished.
pause

rem Clean up.
if exist %Commands% del %Commands%
endlocal
exit /b



rem Transform CSV line into FTP put commmand
:parse
echo put "%1" "%2" >> %Commands%
exit /b

:end
rem Add commands to close ftp conn
echo close >> %Commands%
echo bye   >> %Commands%
exit /b
于 2013-07-08T10:07:52.693 に答える