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. 如何通过登录 ftp 服务器来完成重命名

非常感谢帮助

4

2 回答 2

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 回答
1

打扰一下。这不是对您的 FTP 问题的回答,而是对您的批处理文件的讨论;我看到了一些细节:

根据您的 FOR 命令(“delims=_.-”)和 REN 命令中的名称,我假设您的文件格式是这样的:

TACOS_YYYY-Mon-DD_HH-MM-SS_UTC.csv

其中“Mon”是一个由三个字母组成的月份名称,并且您要重命名为这种格式:

TACOS_YYYYMMDD_HHMMSS.csv

如果这是真的,那么您的 REN 命令可能会导致错误,因为星号表示多个名称!如果要在 TACOS 之后、YYYY 之前、DD 之后和 HH 之前消除字符,那么这不是这样做的方法。也许您计算机中的文件名不会引起问题。尝试在其他地方创建两个或多个具有相同日期和时间以及不同字符的文件;在这种情况下,REN 命令尝试用一个新名称重命名两个或多个文件(除非您知道这不可能发生)。

你的 SETLOCAL/ENDLOCAL 对是没用的。如果要避免可能带有感叹号的名称出现问题,则必须在扩展 %%A..%%F 时禁用延迟扩展。如果你的名字可能有感叹号,那么你的程序必须被修改。

我可以建议您另一种将三个字母的月份转换为两位数的方法吗?该方法在数组元素中使用三个字母作为下标、两位数字作为值的数组,因此转换是立即的。

@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 命令中放置星号的地方的几个字符,那么请告诉我们如何隔离这些字符。例如,如果一个名称以:

TACOSxyz_abcYYYY-Mon-DD...

那么您必须意识到 FOR 命令中的 %%A 是“abcYYYY”,而不仅仅是“YYYY”!

编辑:下面有一个可能的解决方案:

@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 回答