问题描述
我正在构建一个批处理文件,文件名中可能有也可能没有 10 位数字。如果是 10 位数字,我想删除第一个数字。
更具体地说,前导数字可能是 1,在这种情况下,我希望将其删除。
示例文件名:Softphone Test3_2020-12-08 15-23_13216549871.WAV
所需的输出:Softphone Test3_2020-12-08 15-23_3216549871.WAV
在某些情况下,可能只有一个没有前导 1 的 9 位数字,这是可以的,应该保持不变。
如何实现?
解决方法
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory,destination directory,target directory,rem batch directory,filenames,output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
FOR /f "delims=" %%b IN ('dir /b /a-d "%sourcedir%\*.wav" ') DO (
SET "namepart=%%~nb"
IF "!namepart:~-11,1!" neq "_" ECHO REN "%sourcedir%\%%b" "!namepart:~0,-11!!namepart:~-10!.wav"
)
GOTO :EOF
提议的重命名已echo
。将 ECHO REN
更改为 REN
以执行实际重命名。
我建议这个任务的代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%I in ('%SystemRoot%\System32\where.exe "*_???????????.wav" 2^>nul') do (
set "FullName=%%I"
set "FileName=%%~nxI"
setlocal EnableDelayedExpansion
ren "!FullName!" "!FileName:~0,-15!!FileName:~-14!"
endlocal
)
endlocal
它仅处理文件名末尾带有十位数字的 WAV 文件,并通过从十位数字中删除第一位来重命名这些文件。
要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
ren /?
set /?
setlocal /?
where /?
阅读有关 Using command redirection operators 的 Microsoft 文档以了解 2>nul
。重定向运算符 >
必须在 FOR 命令行上用脱字符符 ^
转义,以便在 Windows 命令解释器在执行命令 之前处理此命令行时被解释为文字字符FOR 在后台启动的单独命令进程中执行嵌入的 where
命令行,%ComSpec% /c
和 '
中的命令行作为附加参数附加。