.bat 文件如何对 list.txt 中的每一行重复处理(按列表创建快捷方式)
.bat file how to repeat process for each row in list.txt (creating shortcuts by list)
我的代码现在创建了指向 "list.txt" 中第一行的快捷方式,名称正确(作为调用快捷方式目标中的最后一个文件夹),但我需要对整个 "list.txt" 执行相同的过程,对于每一行,
就好像我为每一行添加了 'skip=1',然后 'skip=2'..... 到 'for /f':
for /f "skip=1 usebackq delims=" %%G IN (List.txt) DO if not
defined line set "line=%%G"
我无法在一个 bat 文件中对每一行重复此过程。怎么做?
@echo off
Setlocal EnableExtensions
for /f "usebackq delims=" %%G IN (List.txt) DO if not defined line set "line=%%G"
set LNKNAME=%line:~0%
for %%f in ("%LNKNAME%") do set LNKNAME_A=%%~nxf
SET SAVETO=%userprofile%\desktop
call :createLink "%LNKNAME_A%" "%line%"
pause
rem createLink <linkname> <target>
:createLink
set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"
echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT%
echo sLinkFile = "%SAVETO%\%~1.lnk" >> %SCRIPT%
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT%
echo oLink.TargetPath = "%~2" >> %SCRIPT%
echo oLink.Save >> %SCRIPT%
cscript /nologo %SCRIPT%
del %SCRIPT%
EXIT /B 0
rem goto :eof
扩展你的循环:
@echo off
Setlocal EnableExtensions enabledelayedexpansion
SET "SAVETO=%userprofile%\desktop"
for /f "usebackq delims=" %%G IN ("List.txt") DO (
set "line=%%G"
set "LNKNAME=!line:~0!"
for %%f in ("!LNKNAME!") do set "LNKNAME_A=%%~nxf"
call :createLink "!LNKNAME_A!" "!line!"
)
pause
goto :eof
:createLink
...
注意:这使用
编辑
将 set saveto=...
移出循环(将其设置为每行相同的值没有任何好处)
考虑到set "LNKNAME=!line:~0!"
没有任何用处,我们可以去掉它,直接使用%%G
。 for %%f
也只是得到 %%~nxf
(您没有提供文本文件的示例,所以我不得不猜测:它不应该只是 %%~nf
吗?),这是和%%nxG
(%%~nG
?)一样,我们也可以去掉,直接使用%%G
和%%nG
。这将代码缩短为:
@echo off
Setlocal EnableExtensions
SET "SAVETO=%userprofile%\desktop"
for /f "usebackq delims=" %%G IN ("List.txt") DO (
call :createLink "%%~nG" "%%G"
)
...
(注意:不再需要延迟扩展)
我的代码现在创建了指向 "list.txt" 中第一行的快捷方式,名称正确(作为调用快捷方式目标中的最后一个文件夹),但我需要对整个 "list.txt" 执行相同的过程,对于每一行, 就好像我为每一行添加了 'skip=1',然后 'skip=2'..... 到 'for /f':
for /f "skip=1 usebackq delims=" %%G IN (List.txt) DO if not defined line set "line=%%G"
我无法在一个 bat 文件中对每一行重复此过程。怎么做?
@echo off
Setlocal EnableExtensions
for /f "usebackq delims=" %%G IN (List.txt) DO if not defined line set "line=%%G"
set LNKNAME=%line:~0%
for %%f in ("%LNKNAME%") do set LNKNAME_A=%%~nxf
SET SAVETO=%userprofile%\desktop
call :createLink "%LNKNAME_A%" "%line%"
pause
rem createLink <linkname> <target>
:createLink
set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"
echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT%
echo sLinkFile = "%SAVETO%\%~1.lnk" >> %SCRIPT%
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT%
echo oLink.TargetPath = "%~2" >> %SCRIPT%
echo oLink.Save >> %SCRIPT%
cscript /nologo %SCRIPT%
del %SCRIPT%
EXIT /B 0
rem goto :eof
扩展你的循环:
@echo off
Setlocal EnableExtensions enabledelayedexpansion
SET "SAVETO=%userprofile%\desktop"
for /f "usebackq delims=" %%G IN ("List.txt") DO (
set "line=%%G"
set "LNKNAME=!line:~0!"
for %%f in ("!LNKNAME!") do set "LNKNAME_A=%%~nxf"
call :createLink "!LNKNAME_A!" "!line!"
)
pause
goto :eof
:createLink
...
注意:这使用
编辑
将 set saveto=...
移出循环(将其设置为每行相同的值没有任何好处)
考虑到set "LNKNAME=!line:~0!"
没有任何用处,我们可以去掉它,直接使用%%G
。 for %%f
也只是得到 %%~nxf
(您没有提供文本文件的示例,所以我不得不猜测:它不应该只是 %%~nf
吗?),这是和%%nxG
(%%~nG
?)一样,我们也可以去掉,直接使用%%G
和%%nG
。这将代码缩短为:
@echo off
Setlocal EnableExtensions
SET "SAVETO=%userprofile%\desktop"
for /f "usebackq delims=" %%G IN ("List.txt") DO (
call :createLink "%%~nG" "%%G"
)
...
(注意:不再需要延迟扩展)