读取目录中所有* .kla文件的文件名,重命名它们并按批次将它们移动到新目录

时间:2014-10-11 14:44:16

标签: batch-file

我想从目录(C:\ TSData \ Klarf)中读取所有* .kla文件的名称并更改其名称,然后将它们移动到新目录(E:\ MESSDAT \ DATEN \ Klatencor \ Klarf )。

对于文件名重命名,在每个.kla文件中,我需要两个变量来获取它们的值:(例如)     LotID“N_123”;插槽1; 并将这些变量组合起来:LotID_Slot.kla创建一个新名称。

我写了这段代码,但是显示了这个错误:“〜nxi此时出乎意料”

@echo off
setlocal  enableDelayedExpansion
set "LotID="
set "Slot="

:: Finding the name of *.kla files in C:\TSData\Klarf\
for /f %%l  in ('dir /b C:\TSData\Klarf\*.kla ') do (
echo %%l
:: Finding LotID, Slot in each .kla file
for /R C:\TSData\Klarf\ %%i in (*.*) do echo %%~nxi
  for /f "usebackq tokens=1,*" %%a in (
    "C:\TSData\Klarf\%%l"
) do for %%c in (%%b) do set "%%a=%%~c"
   move /-y "C:\TSData\Klarf\%%l" "E:\MESSDAT\DATEN\Klatencor\Klarf"
   ren E:\MESSDAT\DATEN\Klatencor\Klarf\%%l "%LotID%_%Slot%.kla"
)

考虑在C:\ TSData \ Klarf \中,在执行路径文件后有一个文件名= 1.kla,这个文件将被重命名为k1_1.kla(因为对于这个文件我们有LotID = k1,Slot = 1 )并将以新名称(k1_1.kla)移动到名为E:\ MESSDAT \ DATEN \ Klatencor \ Klarf \的新目录。

我不知道为什么这个以下For对于一个清晰的.kla文件来说很好。

:: Finding LotID, Slot in each .kla file
for /R C:\TSData\Klarf\ %%i in (*.*) do echo %%~nxi
  for /f "usebackq tokens=1,*" %%a in (
    "C:\TSData\Klarf\K.kla"
) do for %%c in (%%b) do set "%%a=%%~c"
   move /-y "C:\TSData\Klarf\k.kla" "E:\MESSDAT\DATEN\Klatencor\Klarf"
   ren E:\MESSDAT\DATEN\Klatencor\Klarf\k.kla "%LotID%_%Slot%.kla"

请帮助我。 非常感谢!

1 个答案:

答案 0 :(得分:1)

@echo off
setlocal  enableDelayedExpansion
set "LotID="
set "Slot="
:: Settings for OP's version
SET "sourcedir=C:\TSData\Klarf"
SET "destdir=E:\MESSDAT\DATEN\Klatencor\Klarf"
:: Overriding settings for Magoo's setup
SET "sourcedir=U:\TSData\Klarf"
SET "destdir=U:\destdir"

:: Finding the name of *.kla files in C:\TSData\Klarf\
for /f "delims=" %%l in ('dir /b "%sourcedir%\*.kla" ') do (
 echo %%l
 REM
 REM NOTE USE OF REM NOT :: WITHIN A BLOCK (FOR..%%l)
 REM
 REM Finding LotID, Slot in each .kla file
 REM
 REM No idea why this line is here for /R "%sourcedir%" %%i in (*.*) do echo %%~nxi
 REM
 for /f "usebackq tokens=1,*" %%a in (
    "%sourcedir%\%%l"
  ) do for %%c in (%%b) do set "%%a=%%~c"
 REM
 REM Note that MOVE across devices (C: to E: will COPY AFAIAA)
 REM
 ECHO(move /-y "%sourcedir%\%%l" "%destdir%\"
 REM
 REM Note use of !var! not %var% to access changed values LotID and Slot, not original values
 REM
 ECHO(ren "%destdir%\%%l" "!LotID!_!Slot!.kla"
 ECHO(move /-y "%sourcedir%\%%l" "%destdir%\!LotID!_!Slot!.kla"
)
GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。我按照惯例设置它们,并使用值覆盖设置以适合我的系统。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

为了测试目的,所需的MOVE命令仅为ECHO在您确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul以取消报告消息(例如1 file moved

正如我评论的那样,:: comment应该在一个区块内被rem comment替换。

您还没有说明新名称是如何构建的。 " LotID"和" Slot"似乎无处不在。在分析代码时,它会显示类似于

的行
LotID is often k1
Slot might be 1

可能会出现在您的.kla文件中。您设置这些变量的方法可能有效也可能无效 - 如果没有样本数据,则无法判断。

我认为尝试将move文件从一个设备转移到另一个设备实际上copy该文件,因此原始文件将保留在其原始位置,并且副本将显示为新名称目的地。我已经提供了额外的一行,以显示如何在一行而不是两行中完成。

以下是我用于创建.kla文件进行测试的代码,因为您还没有提供样本数据:

FOR %%a IN ("LotID perhaps is Z99"
"Slot is arguably 6") DO ECHO %%~a
)>"%sourcedir%\two.kla"

至于for /r的原因 - 只有天堂知道这意味着什么!


修改:修复带有空格的文件名... for...%%l添加了"delims="选项。

测试的文件名包括:

"%sourcedir%\1.kla"
"%sourcedir%\1 that is one.kla"
"%sourcedir%\t(w)o.kla"
"%sourcedir%\t(w, and a bit)o.kla"
"%sourcedir%\t(w,hree)o.kla"

sourcedir本身包含空格。

如果您找到其他人,请指出文件和目录名失败...