0

我正在尝试将日期添加到从一个目录复制到另一个目录的文件中。这就是它的样子

原始文件名:XEsalary.csv

结果文件名:XEsalary-2013-02-15.csv

这是我的代码:

set REMOTE=U:\ 
set LOG=C:\Integration\FE\log_test 
set PVM=%DATE:~9,4%-%DATE:~6,2%-%DATE:~3,2%
set YY=%DATE:~9,4% 
set LOCAL=C:\FTP\VC\test
cd %LOCAL%

xcopy /y /f /v "%LOCAL%\*.csv" "%REMOTE%\" >>%LOG%\%PVM%.log 
xcopy /y /f /v "%LOCAL%\*.csv" "%LOCAL%\archive\*.csv"  
:: assist with turning this into a for loop
ren %LOCAL%\archive\*.csv %LOCAL%\archive\*%PVM%.csv 
echo. >>%LOG%\%PVM%.log

复制作品只是文件。重命名部分不起作用。请问有什么帮助吗?

提前谢谢:-)

4

2 回答 2

2

Windows 不允许您使用通配符重命名。您必须在 for 循环中命名每个文件。还不如在复制时进行重命名。这是否符合您的预期?

@echo off
setlocal
set REMOTE=U:\ 
set LOG=C:\Integration\FE\log_test 
set PVM=%DATE:~9,4%-%DATE:~6,2%-%DATE:~3,2%
set YY=%DATE:~9,4% 
set LOCAL=C:\FTP\VC\test

xcopy /y /f /v "%LOCAL%\*.csv" "%REMOTE%\" >>%LOG%\%PVM%.log

pushd "%LOCAL%"
for %%I in (*.csv) do (
    rem Uncomment the following line to log the copy to archive.
    rem echo copy "%%I" -^> "%LOCAL%\archive\%%~nI-%PVM%.csv" >>%LOG%\%PVM%.log
    copy "%%I" "%LOCAL%\archive\%%~nI-%PVM%.csv">NUL
)
echo. >>%LOG%\%PVM%.log
popd
于 2013-02-15T14:08:50.293 回答
2

在 RENAME 中使用通配符很棘手。没有好的官方文档,但我已经试验并发布了关于它如何工作的规则:请参阅 Windows RENAME 命令如何解释通配符?

您可以使用以下命令完成重命名,只要您的文件名都不包含点(最后一个扩展点是可以的)。

ren "%LOCAL%\archive\*.csv" ????????????????????-%PVM%*

数量?必须大于或等于文件夹中最长的名称。

如果文件名包含点,则结果将不正确。例如,part1.part2.csv将成为part1-2013-02-15.part2.csv.

另一种选择是使用 FOR 循环。您可以使用此技术安全地将日期附加到任何文件。

for %%F in ("%LOCAL%\archive\*.csv") do ren "%%F" "%%~nF-%PVM%%%~xF"

但是,如果您稍后重新运行该过程,这两种解决方案都会出现问题。新文件将添加到存档中,但新旧存档文件都将重命名为当前日期。那是行不通的。

最好按照rojo 的回答中的建议使用 FOR 循环一步复制和重命名文件。

或者更好的是,使用文件夹名称中的日期创建一个新的存档文件夹,然后将文件复制到有日期的存档文件夹而不重命名:-)

set REMOTE=U:\ 
set LOG=C:\Integration\FE\log_test 
set PVM=%DATE:~9,4%-%DATE:~6,2%-%DATE:~3,2%
set YY=%DATE:~9,4% 
set LOCAL=C:\FTP\VC\test
cd %LOCAL%

xcopy /y /f /v "%LOCAL%\*.csv" "%REMOTE%\" >>%LOG%\%PVM%.log 
md "%LOCAL%\archive\%PMV%
xcopy /y /f /v "%LOCAL%\*.csv" "%LOCAL%\archive\%PVM%"

如果进程可以在同一天运行多次,您可能希望在文件夹名称中包含时间。

于 2013-02-15T14:49:50.197 回答