我正在尝试创建一个脚本,从快捷方式名称中删除“ - 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
答案 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