2012-06-08 3 views
1

У меня есть пакетный файл, в котором я создаю несколько ярлыков, как это:batch - конвертировать повторяющийся код в цикл?

SET VBFILE=createshortcut.vbs 
SET INSTALLPATH=%userprofile%\desktop 
SET NETWORKPATH=I:\Program Files\app\Exec 

SET TARGET_A=%NETWORKPATH%\myapp-CS.exe 
SET LNKNAME_A=The name of the app CS 

FOR /F "tokens=1* delims=;" %%B IN ("Set oWS = WScript.CreateObject("WScript.Shell")") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("sLinkFile = "%INSTALLPATH%\%LNKNAME_A%.lnk"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("Set oLink = oWS.CreateShortcut(sLinkFile)") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.TargetPath = "%TARGET_A%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.Arguments = """) DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.WorkingDirectory = "%NETWORKPATH%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.Save") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 

CSCRIPT %INSTALLPATH%\%VBFILE% 
DEL %INSTALLPATH%\%VBFILE% 

SET TARGET_B=%NETWORKPATH%\myapp-BD.exe 
SET LNKNAME_B=The name of the app BD 

FOR /F "tokens=1* delims=;" %%B IN ("Set oWS = WScript.CreateObject("WScript.Shell")") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("sLinkFile = "%INSTALLPATH%\%LNKNAME_A%.lnk"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("Set oLink = oWS.CreateShortcut(sLinkFile)") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.TargetPath = "%TARGET_B%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.Arguments = """) DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.WorkingDirectory = "%NETWORKPATH%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.Save") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 

CSCRIPT %INSTALLPATH%\%VBFILE% 
DEL %INSTALLPATH%\%VBFILE% 

Есть ли способ уменьшить repeatative код и поместить его в операторах GOTO или для цикла?

С GOTO я не могу найти способ вернуться обратно туда, где был вызван GOTO. В for-loop я не могу найти хороший способ переписать переменные с новыми значениями на каждой итерации.

Что вы предложите?

ответ

2

Вы можете использовать call в качестве замены для goto, который будет автоматически возвращаться в код вызова, когда функция завершена.

@echo off 
echo Starting batch file 
call :RepeatFunction 
echo Finished 

:RepeatFunction 
FOR /F "tokens=1* delims=;" %%B IN ("Set oWS = WScript.CreateObject("WScript.Shell")") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("sLinkFile = "%INSTALLPATH%\%LNKNAME_A%.lnk"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN ("Set oLink = oWS.CreateShortcut(sLinkFile)") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.TargetPath = "%TARGET_A%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.Arguments = """) DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" ' oLink.WorkingDirectory = "%NETWORKPATH%"") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
FOR /F "tokens=1* delims=;" %%B IN (" oLink.Save") DO ECHO %%B>>%INSTALLPATH%\%VBFILE% 
2

Вы должны использовать функции: Проверить эту ссылку для получения дополнительной информации Batch Functions

Смежные вопросы