下面是我的场景:
我在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目录下,需要使用上面的脚本重命名。
问题:
我们非常感谢你的帮助。
发布于 2013-01-20 23:26:23
它只能通过一个文件来实现:
!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-21 03:20:45
打扰了。这不是对FTP问题的回答,而是对批处理文件的讨论;我看到有关它的一些细节:
根据FOR命令(“files =.-”)和REN命令中的名称,我假设您的文件的格式如下:
TACOS_YYYY-Mon-DD_HH-MM-SS_UTC.csv其中"Mon“是一个三个字母的月份名称,您希望将其重命名为以下格式:
TACOS_YYYYMMDD_HHMMSS.csv如果这是正确的,那么您的REN命令可能会导致一个错误,因为星号包含多个名称!如果你想在玉米饼之后、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...然后您必须意识到%A在您的FOR命令中是"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
)https://stackoverflow.com/questions/14429479
复制相似问题