使用for循环重命名lnks时的批处理奇怪行为

时间:2017-06-26 07:05:50

标签: batch-file for-loop

我正在尝试创建一个脚本,从快捷方式名称中删除“ - 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 - Shortuct.lnk”给出一个空白的lnk文件和“x1.lnk”

这是我正在使用的脚本

@echo off
setlocal enabledelayedexpansion

for %%i in ("*.lnk") do (

    set CurrentFile=%%i
    set NewName=!CurrentFile:~0,-15!.lnk
    ren "%%i" "!NewName!"

)
pause

2 个答案:

答案 0 :(得分:3)

正在发生的事情是,当文件为ren时,新名称将放在目录中,而不是旧名称,因此for会再次找到文件名,因为它会机械地处理名称因为它遇到了它们。

三种解决方案

您可以将面具更改为

for %%i in ("* - shortcut.lnk") do (

您可以更改处理,以确保在重命名之前shortcut文本仍然存在,方法是重命名

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命令只会选择适当的结尾名称,所以尽管在之前的运行中有rnamed文件,但是该过程可以重复运行。

答案 1 :(得分:2)

由于您正在尝试删除特定字符串(而不是通常缩短文件名),因此如果存在,您可能更安全地使用替换运算符明确删除- Shortcut

@echo off
setlocal enabledelayedexpansion

for %%i in ("*.lnk") do (

    set "CurrentFile=%%i"
    set "NewName=!CurrentFile: - Shortcut=!"
    ren "%%i" "!NewName!"

)
pause