Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用for循环重命名LNK时的批处理异常行为_Batch File_For Loop - Fatal编程技术网

Batch file 使用for循环重命名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

我试图制作一个脚本,从快捷方式名称中删除“-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”

这是我正在使用的脚本

@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文件。然后你的子串就可以工作了。