Batch file 批处理脚本,用于登录FTP服务器并以特定格式重命名文件
以下是我的设想: 我在FTP服务器上有文件,需要自动重命名。我创建了一个脚本来重命名文件名,如下所示,该脚本在我的计算机上运行良好:Batch file 批处理脚本,用于登录FTP服务器并以特定格式重命名文件,batch-file,ftp,rename,Batch File,Ftp,Rename,以下是我的设想: 我在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.cs
@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目录下,需要使用上面的脚本重命名该目录
问题:
非常感谢您的帮助只需一个文件即可实现:
!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
你能试试这个吗?对不起。这不是对FTP问题的回答,而是对批处理文件的讨论;我看到了一些细节: 根据FOR命令(“delims=。-”)和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...
然后您必须意识到FOR命令中的%%A是“abcyyy”,而不仅仅是“yyy”
编辑:下面有一个可能的解决方案:
@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
)
对于脚本的目录,您的意思是我将保存此脚本的位置??感谢您的帮助…您提供的代码不会从FTP服务器传输所有文件。。。Don目录中只有6个文件,它甚至不会更改文件名。。。此外,我希望重命名后的文件以相同的don目录放回FTP服务器。如果您希望,我可以向您发送命令提示的结果,如果您想查看,请在使用FTP连接到存储后尝试
mget*.csv
?这将下载所有具有csv扩展名的文件。您可以使用内置ftp客户端连接到服务器。只需在命令提示符下写入ftp
。使用open host
,您可以连接到ftp主机,并使用cd和lcd导航到本地和远程目录。因此,您可以列出文件并检查mget是否将下载我面临的问题不是重命名函数,而是在FTP中运行重命名函数