根据第一行中两个值的内容重命名文件

时间:2017-04-26 00:46:58

标签: batch-file

我的文件第一行看起来像这样:

VND | OVERSTOCKL | OSH | 004010

它是一个管道分隔符,只有前三个字符在所有文件中保持不变。 我需要一个读取第一行的批处理文件,并且只有当它找到“OVERSTOCKL”时,它才会将文件从####重命名。###到OVERSTOCKL856.DAT

856基于OSH位于第一线的第三位。

如果是OIN,那么它应该是OVERSTOCKL810.DAT

如果是OIB,那么它应该是OVERSTOCKL846.DAT

如果是OPR,那么它应该是OVERSTOCKL855.DAT

如果未找到OVERSTOCKL,则它不应对文件名执行任何操作。

可以这样做吗?

感谢。

2 个答案:

答案 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中的每个文件名,请将nameprocessed设置为 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部分以执行重命名。