Csv 使用Bat文件复制和重命名

Csv 使用Bat文件复制和重命名,csv,batch-file,Csv,Batch File,我也在()上发布了这个问题 我已经阅读了很多关于这方面的文章,并用下面的代码解决了复制和重命名文件的问题,但是当我试图理解这个网站上关于这个主题的一些文章时,我仍然感到不知所措 xcopy "M:\abc.csv" "O:\File" set HR=%time:~0,2% set HR=%Hr: =0% set HR=%HR: =% rename "O:\File\abc.csv" "x_%date:~10,4%-%date:

我也在()上发布了这个问题 我已经阅读了很多关于这方面的文章,并用下面的代码解决了复制和重命名文件的问题,但是当我试图理解这个网站上关于这个主题的一些文章时,我仍然感到不知所措

xcopy "M:\abc.csv" "O:\File"
set HR=%time:~0,2%
set HR=%Hr: =0%
set HR=%HR: =%
rename "O:\File\abc.csv" "x_%date:~10,4%-%date:~4,2%-%date:~7,2%_%HR%%time:~3,2%.csv"
我的输出是file name=x_YYYY-MM-DD_TTTT.csv,我不知道所有变量是如何工作的,但我需要获取这个bat文件,将abc.csv文件重命名为类似“MM-DD-YYYY-#XXX.csv”的文件。“#”是一个增量值,取决于一天中重命名的文件数量(需要从第二天开始),而“XXX”只是每个文件的一个设置文本值。abc.csv每天都有相同的名称。我开始玩剧本,但我被卡住了。我知道我错过了增量部分

xcopy "M:\abc.csv" "P:\File"
set HR=%time:~0,2%
set HR=%Hr: =0%
set HR=%HR: =%
rename "P:\File\abc.csv" "%date:~4,2%-%date:~7,2%-%date:~10,4%XXX.csv"
最后一个问题是,在我正在复制和重命名的文件夹中,它们有3个文件(abc.csv、def.csv、hij.csv),所有3个文件都将被复制和重命名。相同的日期和增量格式,但具有不同的“XXX”文本。您是否将所有这些都放在一个bat文件中(我假设您不能在同一个脚本中容纳所有这些内容,您必须执行单独的行)或将其拆分为3个不同的bat文件

我用实际的文件名和目录编辑了代码,也取得了一些进展。当您运行
echo ren
并输出多行代码时,它们都是相同的输出“04-28-2021-1Custinfo.txt”,这是否意味着代码的增量部分不起作用

@echo off
 setlocal enabledelayedexpansion
  for /d /r %%a in (*) do (
    set n=0
    set HR=%time:~0,2%
    set HR=%Hr: =0%
    set HR=%HR: =%   
    pushd "P:\Jarett\SM_TEST\IN"
      for /f "delims=" %%b in (' dir /b /a-d 2^>nul ') do (
        set /a n=n+1
           set num=0!n!
           echo ren "P:\Jarett\SM_TEST\IN\Header3.txt" "%date:~4,2%-%date:~7,2%-%date:~10,4%-!num:~-1!%Custinfo.txt"
    )
   popd
  )
pause
我觉得在循环中,我尝试了我找到的其他代码,但当我再次运行它时,它会将Header3.txt文件保存为最终目标文件夹中的Header3.txt。当我第二次运行bat文件时,我试图将其保存为04-29-2021-2Custinfo.txt。我会一直拉一个Header3.txt文件,这有关系吗?这就是为什么它不算在内

xcopy "M:\Sage 100 Advanced\2018\MAS90\John\MAS_Mirror\SM_TEST\IN\Header3.txt" "P:\Jarett\SM_TEST\IN" 
rem Presumes %date% returns Ddd DD/MM/YYYY so may need adjusting if American format
set today=%date:~4,2%-%date:~7,2%-%date:~10,4%
echo %today%
echo "Moving today's files to temp"
mkdir C:\Users\jarett.AS\temp
move %today%* temp
move Header3.txt temp
cd temp
set count=0
for %%x in (Header3.txt) do (set /a count+=1)
set count=00%count%
set count=%count:~-1%
rename "P:\Jarett\SM_TEST\IN\Header3.txt" "%today%-%count%Custinfo.txt"
move *.txt ..
这是我最后开始工作的代码。一直在玩它,以充分了解一切,并尝试不同的事情。我尝试重命名Header3.txt
重命名Header3.txt%today%-%count%Custinfo%count%.txt
但每次都只是将其重命名为04-30-2021-1Custinfo1.txt。有人能指出我需要进一步研究的领域吗

set today=%date:~4,2%-%date:~7,2%-%date:~10,4%
if not exist .\temp mkdir temp
move %today%* temp
xcopy "M:\Sage 100 Advanced\2018\MAS90\John\MAS_Mirror\SM_TEST\IN\Header3.txt" "P:\Jarett\SM_TEST\IN"
move P:\Jarett\SM_TEST\IN\Header3.txt temp
cd temp
set count=0
for %%x in (*.txt) do (set /a count+=1)
set count=00%count%
set count=%count:~-1%
rename Header3.txt %today%-%count%Custinfo.txt
move *.txt P:\Jarett\SM_TEST\IN

有些计数不清楚,但如果您想要更改,可以进行更改

例如,不清楚您希望如何编号,是否可以,或者是否希望每个XXX都使用编号

请尝试以下代码:

@echo off & setlocal EnableDelayedExpansion

cls

set sizemax=130
mode con: COLS=%sizemax% LINES=35

rem create "box" macro "Box"
set "Box=call :box"

%Box% "Prepare the test environment ..."
pause

cd %tmp%
mkdir TEST 2>nul
mkdir Jarett 2>nul

set "source_folder=%tmp%\TEST"
set "destination_folder=%tmp%\Jarett"

echo >%source_folder%\abc.csv
echo >%source_folder%\def.csv
echo >%source_folder%\hij.csv

%Box% "Source Folder"
dir %source_folder% & pause

%Box% "Destination Folder"
dir %destination_folder% & pause 

cls
%Box% "Test the script." & pause

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal EnableDelayedExpansion

rem set source and destination directory/folder
rem remove rem before using the script in production environment in the following two lines
rem set "source_folder=M:\TEST"
rem set "destination_folder=P:\Jarett"

rem assume all file of type and extension "CSV"

rem create 3 variable for the file name. You can change the name of the file abc,def,hij
set "File1=abc"
set "File2=def"
set "File3=hij"

rem create a map and lookup that associate abc with XXX01, def with XXX02, hij with XXX03. You can change the string XXX01, XXX02, XXX03
SET map=!File1!-XXX01;!File2!-XXX02;!File3!-XXX03;
%Box% "map=!map!" & pause

for %%N in (!File1!, !File2!, !File3!) do (

  rem Set the "today" variable. Choice the correct for you language setting and delete/comment others.
  set "today=%date:~7,2%-%date:~4,2%-%date:~10,4%"
  set "today=%date:~4,2%-%date:~7,2%-%date:~10,4%"
  set "today=%date:~3,2%-%date:~0,2%-%date:~6,4%" & rem italian default to MM-DD-YYYY
  %Box% "file:%%N today=!today!" & pause

  rem Count today csv, add 1 and prepare to pad.
  for /f %%f in (' dir !destination_folder!\!today!*.csv /b /a-d 2^>nul ^| find /c /v "" ') do set /a "count=%%f+10001"
  %Box% "file:%%N count=!count!" & pause

  rem prepare time part
  set "now=!time:~0,-3!" & set "now=!now: =0!" & set "now=!now::=.!"
  %Box% "file:%%N now=!now!" & pause

  call :lookup_XXX_map %%N
  %Box% "file:%%N XXX=!XXX!" & pause

  %Box% "move !source_folder!\%%N.csv !destination_folder!\!today!_!now!_!count:~-3!_!XXX!.csv" & pause
  move !source_folder!\%%N.csv !destination_folder!\!today!_!now!_!count:~-3!_!XXX!.csv

  %Box% "Destination Folder"
  dir !destination_folder! & pause
)

echo Exit/End ... & pause

goto :eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:box
  set "s=%~1"
  set /A s1=%sizemax%-1, s2=s1-1
  set "l="
  for /L %%B in (1,2,%sizemax%) do set "l=!l!--" & if "!s:~%s1%,1!" == "" set "s= !s! "
  set "s=!s:~1,%s2%!"
  set "l=!l:~0,%s2%!"
  for %%B in ("" "+%l%+" "|%s%|" "+%l%+" "") do echo(%%~B
goto :eof

:lookup_XXX_map
  CALL SET XXX=%%map:*%1-=%%
  SET XXX=%XXX:;=&:%"
goto :eof
必须为“日期”变量选择正确的布局。然后你就可以跑了

测试正常后,移除多余的线路,如下所示:

@echo off
setlocal EnableDelayedExpansion

rem set source and destination directory/folder
set "source_folder=M:\TEST"
set "destination_folder=P:\Jarett"

rem assume all file of type and extension "CSV"

rem create 3 variable for the file name. You can change the name of the file abc,def,hij
set "File1=abc"
set "File2=def"
set "File3=hij"

rem create a map and lookup that associate abc with XXX01, def with XXX02, hij with XXX03. You can change the string XXX01, XXX02, XXX03
SET map=!File1!-XXX01;!File2!-XXX02;!File3!-XXX03;

for %%N in (!File1!, !File2!, !File3!) do (

  rem Set the "today" variable. Choice the correct for you language setting and delete/comment others.
  set "today=%date:~7,2%-%date:~4,2%-%date:~10,4%"

  rem Count today csv, add 1 and prepare to pad.
  for /f %%f in (' dir !destination_folder!\!today!*.csv /b /a-d 2^>nul ^| find /c /v "" ') do set /a "count=%%f+10001"

  rem prepare time part
  set "now=!time:~0,-3!" & set "now=!now: =0!" & set "now=!now::=.!"
 
  call :lookup_XXX_map %%N
  
  move !source_folder!\%%N.csv !destination_folder!\!today!_!now!_!count:~-3!_!XXX!.csv

)

echo Exit/End ... & pause

goto :eof

:lookup_XXX_map
  CALL SET XXX=%%map:*%1-=%%
  SET XXX=%XXX:;=&:%"
goto :eof

SET
命令的帮助文件中清楚地解释了
SET
命令语法。打开命令提示符并键入:
set/?
。还有数百个示例说明如何以不依赖于PC、区域设置或用户设置的方式正确检索日期和时间的各个组件。我建议你把你的任务分解成更小的任务,一旦你完成了每一个任务,试着把它们合并成一个解决方案。目前,作为健壮的代码,您需要的是几个不同问题的答案(可能需要进一步解释
abc
XXX
之间的相关性)。可能是实际的源文件名和它们各自产生的目标文件名!如果您能够解释使用
xcopy.exe
执行单个复制命令(而不是内部
copy
命令本身)是否有特定的原因,这也可能会有所帮助。我可能会建议,将文件以新名称作为单个命令复制可能比将文件作为一个命令复制,然后将该文件重命名为单独的命令要好。@Compo不知道如何使用
xcopy
,这是我第一次处理简单任务
ROBOCOPY
也起到了作用,但之后我还在为代码而挣扎。
abc
xxx
之间没有相关性,
xxx
实际上是一个较长的文本字符串。这将是实际的源文件名“P:\Jarett\SM\u TEST\IN\Header.txt”,这将是我希望输出为“04-28-2021-1Custinfo.txt”打开命令提示窗口,键入
copy/?
,按
[输入]
键,然后读取显示的输出。您也可以使用
rename/?
set/?
xcopy/?
robocy/?
执行相同的操作,以获取它们的帮助和使用信息。请不要忽略本网站每页顶部的搜索框,它将帮助您找到将日期和时间组件转换为所需格式的示例。