首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理脚本登录到FTP服务器并以特定格式重命名文件

批处理脚本登录到FTP服务器并以特定格式重命名文件
EN

Stack Overflow用户
提问于 2013-01-20 21:22:02
回答 2查看 4.5K关注 0票数 1

下面是我的场景:

我在FTP服务器上有文件,需要自动重命名。我创建了一个脚本来重命名文件名,如下所示,它在我的计算机上运行得很好:

代码语言:javascript
复制
 @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上运行这个函数。为此,我使用以下脚本:

代码语言:javascript
复制
FTP -s:ftpscript.txt

文本文件是

代码语言:javascript
复制
open 192.168.1.5
ftp-user
ftpuser
cd reports/Don

这些文件基本上位于Don目录下,需要使用上面的脚本重命名。

问题:

  1. 我们需要两个脚本来处理这个问题吗?
  2. 如何通过登录ftp服务器实现重命名?

我们非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-01-20 23:26:23

它只能通过一个文件来实现:

代码语言:javascript
复制
!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

你能试试这个吗?

票数 1
EN

Stack Overflow用户

发布于 2013-01-21 03:20:45

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

根据FOR命令(“files =.-”)和REN命令中的名称,我假设您的文件的格式如下:

代码语言:javascript
复制
TACOS_YYYY-Mon-DD_HH-MM-SS_UTC.csv

其中"Mon“是一个三个字母的月份名称,您希望将其重命名为以下格式:

代码语言:javascript
复制
TACOS_YYYYMMDD_HHMMSS.csv

如果这是正确的,那么您的REN命令可能会导致一个错误,因为星号包含多个名称!如果你想在玉米饼之后、YYYY之前、DD之后和HH之前删除字符,那么这不是这样做的。也许您的计算机中的文件名不会引起问题。尝试创建两个或多个具有相同日期和时间以及其他地方不同字符的文件;在本例中,REN命令尝试用一个新名称重命名两个或多个文件(除非您知道这是不可能发生的)。

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

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

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

代码语言:javascript
复制
TACOSxyz_abcYYYY-Mon-DD...

然后您必须意识到%A在您的FOR命令中是"abcYYYY",而不仅仅是"YYYY"!

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

代码语言:javascript
复制
@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
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14429479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档