.bat файл, как повторить процесс для каждой строки в list.txt (создание ярлыков по списку) - PullRequest
0 голосов
/ 29 октября 2018

Мой код теперь создает ярлык для первой строки в «list.txt» с правильным именем (как называется последняя папка в назначении ярлыка), но мне нужно сделать тот же процесс со всем «list.txt», для каждый ряд, как если бы я добавил 'skip = 1', то 'skip = 2' ..... в ' для / f ' для каждой строки:

for / f " skip = 1 usebackq delims =" %% G IN (List.txt) DO, если нет определенный набор строк "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

1 Ответ

0 голосов
/ 29 октября 2018

просто разверните цикл:

@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"
)
...

(Примечание: отсроченное расширение больше не требуется)

...