我想从目录(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"
请帮助我。 非常感谢!
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。我按照惯例设置它们,并使用值覆盖设置以适合我的系统。
为了测试目的,所需的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
本身包含空格。
如果您找到其他人,请指出文件和目录名失败...