我正在尝试将复制文件的日期从一个目录添加到另一个目录。这就是它应该是什么样子
原始文件名: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
复制只是文件。它是重命名部分,不起作用。有什么帮助吗?
提前Thx: - )
答案 0 :(得分: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
答案 1 :(得分:2)
在RENAME中使用通配符很棘手。没有好的官方文档,但我已经试验并发布了它的工作原理:见How does the Windows RENAME command interpret wildcards?
您可以使用以下命令完成重命名,只要您的文件名都不包含点(最后一个扩展点为OK)。
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's answer中建议的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%"
如果进程可以在同一天多次运行,您可能希望在文件夹名称中包含时间。