1

これが私のシナリオです:

自動的に名前を変更する必要がある FTP サーバー上のファイルがあります。次のようにファイル名を変更するスクリプトを作成しましたが、これは私のコンピューターで完全に機能しています。

 @echo off
setlocal
for /f "tokens=2-7 delims=_.-" %%A in ('dir /B TACOS_*') do (
  setlocal enabledelayedexpansion
  call :getmonth %%B
  ren TACOS*_*%%A-%%B-%%C*_*%%D-%%E-%%F_UTC.csv TACOS_%%A!mon!%%C_%%D%%E%%F.csv
  endlocal
)


:getmonth
if "%1" equ "Jan" set mon=01
if "%1" equ "Feb" set mon=02
if "%1" equ "Mar" set mon=03
if "%1" equ "Apr" set mon=04
if "%1" equ "May" set mon=05
if "%1" equ "Jun" set mon=06
if "%1" equ "Jul" set mon=07
if "%1" equ "Aug" set mon=08
if "%1" equ "Sep" set mon=09
if "%1" equ "Oct" set mon=10
if "%1" equ "Nov" set mon=11
if "%1" equ "Dec" set mon=12
goto :eof
endlocal

ここで、サーバーにログインして、この機能を ftp で実行したいと考えています。このために、次のスクリプトを使用しています。

FTP -s:ftpscript.txt

そしてテキストファイルは

open 192.168.1.5
ftp-user
ftpuser
cd reports/Don

ファイルは基本的に、上記のスクリプトを使用して名前を変更する必要がある Don ディレクトリの下にあります。

質問:

  1. これを処理するには 2 つのスクリプトが必要ですか?

  2. FTPサーバーにログインして名前を変更するにはどうすればよいですか

助けていただければ幸いです

4

2 に答える 2

1

すみません。これは FTP に関する質問への回答ではなく、バッチ ファイルに関する議論です。私はそれについていくつかの詳細を見ます:

In accordance with your FOR command ("delims=_.-") and the name in the REN command, I assume that the format of your files is this:

TACOS_YYYY-Mon-DD_HH-MM-SS_UTC.csv

Where "Mon" is a three-letter month name, and that you want to rename to this format:

TACOS_YYYYMMDD_HHMMSS.csv

If this is true, then your REN command may cause an error because the asterisks imply several names! If you want to eliminate characters after TACOS, before YYYY, after DD and before HH, then this is not the way to do it. Perhaps the file names in your computer don't cause problems. Try to create two or more files with the same date and hour and different characters in the other places; in this case, the REN command try to rename two or more files with just one new name (unless you know that there is no way this happen).

SETLOCAL/ENDLOCAL のペアは役に立ちません。感嘆符が含まれている可能性のある名前の問題を回避したい場合は、%%A..%%F を展開するときに遅延展開を無効にする必要があります。名前に感嘆符が含まれている可能性がある場合は、プログラムを変更する必要があります。

3 文字の月を 2 桁に変換する別の方法を提案してもよろしいですか? このメソッドは、添字として 3 文字、配列要素の値として 2 桁の配列を使用するため、変換は即時に行われます。

@echo off
setlocal EnableDelayedExpansion
rem Create the array for months conversion
set m=100
for %%A in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
  set /A m+=1
  set mon[%%A]=!m:~-2!
)
for /f "tokens=2-7 delims=_.-" %%A in ('dir /B TACOS_*') do (
  ren TACOS*_*%%A-%%B-%%C*_*%%D-%%E-%%F_UTC.csv TACOS_%%A!mon[%%B]!%%C_%%D%%E%%F.csv
)

REN コマンドでアスタリスクを配置した場所にあるいくつかの文字を削除したい場合は、それらの文字を分離する方法を教えてください。たとえば、1 つの名前が次で始まる場合:

TACOSxyz_abcYYYY-Mon-DD...

次に、FOR コマンドの %%A が「YYYY」ではなく「abcYYYY」であることを認識する必要があります。

編集:以下に可能な解決策があります:

@echo off
setlocal EnableDelayedExpansion
rem Create the array for months conversion
set m=100
for %%A in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
  set /A m+=1
  set mon[%%A]=!m:~-2!
)
for /f "tokens=2-7 delims=_.-" %%A in ('dir /B TACOS_*') do (
  set YYYY=%%A
  set DD=%%C
  set HH=%%D
  set SS=%%F
  ren TACOS*_*%%A-%%B-%%C*_*%%D-%%E-%%F_UTC.csv TACOS_!YYYY:~-4!!mon[%%B]!!DD:~0,2!_!HH:~-2!%%E!SS:~0,2!.csv
)
于 2013-01-21T03:20:45.590 に答える
1

1 つのファイルのみで実現できます。

!cls&echo off&setlocal ENABLEDELAYEDEXPANSION
!cls&goto :ftp_border
open 192.168.1.5
ftp-user
ftpuser
cd reports/Don
lcd c:\direcotry_where_the_script_is
mget *.csv
bye

:ftp_border
@echo off
endlocal

ftp -s:%0


setlocal
for /f "tokens=2-7 delims=_.-" %%A in ('dir /B TACOS_*') do (
  setlocal enabledelayedexpansion
  call :getmonth %%B
  ren TACOS*_*%%A-%%B-%%C*_*%%D-%%E-%%F_UTC.csv TACOS_%%A!mon!%%C_%%D%%E%%F.csv
  endlocal
)


:getmonth
if "%1" equ "Jan" set mon=01
if "%1" equ "Feb" set mon=02
if "%1" equ "Mar" set mon=03
if "%1" equ "Apr" set mon=04
if "%1" equ "May" set mon=05
if "%1" equ "Jun" set mon=06
if "%1" equ "Jul" set mon=07
if "%1" equ "Aug" set mon=08
if "%1" equ "Sep" set mon=09
if "%1" equ "Oct" set mon=10
if "%1" equ "Nov" set mon=11
if "%1" equ "Dec" set mon=12
goto :eof
endlocal

これで試してみませんか?

于 2013-01-20T23:26:23.543 に答える