我的文件第一行看起来像这样:
VND | OVERSTOCKL | OSH | 004010
它是一个管道分隔符,只有前三个字符在所有文件中保持不变。 我需要一个读取第一行的批处理文件,并且只有当它找到“OVERSTOCKL”时,它才会将文件从####重命名。###到OVERSTOCKL856.DAT
856基于OSH位于第一线的第三位。
如果是OIN,那么它应该是OVERSTOCKL810.DAT
如果是OIB,那么它应该是OVERSTOCKL846.DAT
如果是OPR,那么它应该是OVERSTOCKL855.DAT
如果未找到OVERSTOCKL,则它不应对文件名执行任何操作。
可以这样做吗?
感谢。
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*" '
) DO (
SET "processed="
SET "name="
FOR /f "usebackqtokens=1-4delims=|" %%t IN ("%sourcedir%\%%a") DO (
IF NOT DEFINED processed IF "%%u"=="OVERSTOCKL" (
IF "%%v"=="OIN" SET "name=810"
IF "%%v"=="OIB" SET "name=846"
IF "%%v"=="OPR" SET "name=855"
IF "%%v"=="OSH" SET "name=856"
)
SET "processed=Y"
)
IF DEFINED name CALL :CHANGE "%%a"
)
GOTO :EOF
:CHANGE
IF "%~1"=="OVERSTOCKL%name%.dat" GOTO :eof
IF EXIST "%sourcedir%\OVERSTOCKL%name%.dat" (
ECHO OVERSTOCKL%name%.dat already exists naming "%~1"
GOTO :eof
)
ECHO(REN "%sourcedir%\%~1" "OVERSTOCKL%name%.dat"
GOTO :eof
您需要更改sourcedir
的设置以适合您的具体情况。
为了测试目的,所需的REN命令仅为ECHO
。 在您确认命令正确后,将ECHO(REN
更改为REN
以实际重命名文件。
在没有目录的/b
基本模式/a-d
中执行源目录的目录扫描,并将找到的每个文件名分配给%%a
。
对于%%a
中的每个文件名,请将name
和processed
设置为 nothing 并从文件中读取一行。如果第二个令牌是指定的,则将name
设置为第三个令牌中的潜在新名称。
将processed
设置为任意值可确保只读取第一行。
如果设置了name
,则需要重命名并由子例程:change
执行。
如果已经检查了正在处理的文件名,请不要尝试重命名。如果目标名称已存在,则生成错误行,如果不存在,请执行重命名。
答案 1 :(得分:0)
此解决方案假设" VND | OVERSTOCKL |"字符串只能出现在第一行;如果不是这样,则需要进行小的修改。
@echo off
setlocal EnableDelayedExpansion
rem Define the equivalence numbers
set "number[OSH]=856"
set "number[OIN]=810"
set "number[OIB]=846"
set "number[OPR]=855"
rem Process files that have "VND|OVERSTOCKL|" string at beginning of line only
cd "D:\Folder"
for /F "tokens=1,3,4 delims=:|" %%a in ('findstr /B "VND|OVERSTOCKL|" *.*') do (
rem FINDSTR output have this format: "FILENAME.EXT:VND|OVERSTOCKL|OSH|004010"
rem Do the required rename
ECHO ren "%%a" "%%b!number[%%c]!.DAT"
)
ren
命令刚刚响应屏幕。如果输出正确,请删除ECHO
部分以执行重命名。