Batch file 使用for循环重命名LNK时的批处理异常行为
我试图制作一个脚本,从快捷方式名称中删除“-Shortcut”,并发现了一个奇怪的现象,如果名称少于6个字符,而不包括“-Shortcut.lnk”,则循环会对该文件进行额外的循环,并使其名称为空。但是,这仅适用于第一个文件,而不适用于第一个文件之后的任何文件 因此,如果我们有两个lnk文件,一个是“12345–Shortcut.lnk”,另一个是“C1–Shortcut.lnk”,则输出是一个空白lnk文件和一个“C1.lnk” 但是“123456-Shortcut.lnk”和“C1-Shortcut.lnk”给出了“123456.lnk”和“C1.lnk”的工作方式 “x1–Shortcut.lnk”和“c1–Shortcut.lnk”给出一个空白的lnk文件和“x1.lnk” 这是我正在使用的脚本Batch file 使用for循环重命名LNK时的批处理异常行为,batch-file,for-loop,Batch File,For Loop,我试图制作一个脚本,从快捷方式名称中删除“-Shortcut”,并发现了一个奇怪的现象,如果名称少于6个字符,而不包括“-Shortcut.lnk”,则循环会对该文件进行额外的循环,并使其名称为空。但是,这仅适用于第一个文件,而不适用于第一个文件之后的任何文件 因此,如果我们有两个lnk文件,一个是“12345–Shortcut.lnk”,另一个是“C1–Shortcut.lnk”,则输出是一个空白lnk文件和一个“C1.lnk” 但是“123456-Shortcut.lnk”和“C1-Shor
@echo off
setlocal enabledelayedexpansion
for %%i in ("*.lnk") do (
set CurrentFile=%%i
set NewName=!CurrentFile:~0,-15!.lnk
ren "%%i" "!NewName!"
)
pause
由于您试图删除特定字符串,而不是通常缩短文件名,因此使用替换运算符显式删除-快捷方式(如果存在)可能更安全:
@echo off
setlocal enabledelayedexpansion
for %%i in ("*.lnk") do (
set "CurrentFile=%%i"
set "NewName=!CurrentFile: - Shortcut=!"
ren "%%i" "!NewName!"
)
pause
发生的情况是,重命名文件时,新名称在目录中的位置晚于旧名称,因此for会在遇到名称时机械地处理名称时再次找到文件名 三个解决方案 你可以把你的面具换成
for %%i in ("* - shortcut.lnk") do (
您可以更改处理,以确保在重命名之前快捷方式文本仍然存在,方法是选择重命名
if /i "!CurrentFile:~0,-15!"=="- shortcut.lnk" (
(
set NewName=!CurrentFile:~0,-15!.lnk
ren "%%i" "!NewName!"
)
或者使用for/f,它在内存中构建一个列表,然后处理该列表,因此只有旧名称存在
for /f "delims=" %%i in ('dir /b/a-d "*.lnk" ') do (
或者最好
for /f "delims=" %%i in ('dir /b/a-d "* - shortcut.lnk" ') do (
第二个更好,因为dir命令将只选择适当结尾的名称,因此,即使之前运行过RNAME文件,该过程也可以重复运行。不要使用%%i in*.lnk,而要使用/F delims=eol=|%%i in'dir/B/a:-D*.lnk'查看以下详细信息:…第一手资料,您应该只获取名称中带有“-shortcut”的文件,而不要使用通配符获取所有.lnk文件。然后你的子串就可以工作了。