簡體   English   中英

批處理文件生成另一個批處理文件,該批處理文件生成另一個文件

[英]batch file makes another batch file which make another file

我想寫一個批處理文件,它制作另一個制作文件的批處理文件。

我寫了這樣的東西。

echo:IF EXIST %%ALLUSERSPROFILE%%\Pulpit (SET AutoStart="%%ALLUSERSPROFILE%%\Menu Start\Programy\Autostart\go2.bat" )> %Esc_LinkTarget%\GO.BAT
echo:IF EXIST %%ALLUSERSPROFILE%%\Desktop  (SET AutoStart="%%ALLUSERSPROFILE%%\Microsoft\Windows\Start Menu\Programs\Startup\go2.bat" ) >> %Esc_LinkTarget%\GO.BAT
echo:ECHO:REM DEKLARACJA LITERY MAPOWANEGO DYSKU ^> %%AutoStart%% >> %Esc_LinkTarget%\GO.BAT
echo:ECHO:SET MapLetter=T: ^>^> %%AutoStart%% >> %Esc_LinkTarget%\GO.BAT
echo:ECHO:NET USE %%%%MapLetter%%%%\\%COMPUTERNAME%\%LinkName% ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:ECHO:echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Pulpit (SET Esc_LinkDest=%%%%ALLUSERSPROFILE%%%%\Pulpit\ ) %%>>%% %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:ECHO:echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Desktop  (SET Esc_LinkDest=%%%%ALLUSERSPROFILE%%%%\Desktop\ ) ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:ECHO:echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Pulpit\%LinkName%.lnk GOTO DLP1 ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:ECHO:echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Desktop\%LinkName%.lnk GOTO DLP1 ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:echo Set oWS = WScript.CreateObject("WScript.Shell") ^^> tmp.vbs ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:echo sLinkFile = "%%%%Esc_LinkDest%%%%%LinkName%.lnk" ^^>^^> tmp.vbs ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:echo Set oLink = oWS.CreateShortcut(sLinkFile) ^^>^^> tmp.vbs ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:echo oLink.TargetPath = "%%%%MapLetter%%%%\" ^^>^^> tmp.vbs ^>^>%%AutoStart%% >> %Esc_LinkTarget%\GO.BAT
echo:echo:echo oLink.Save ^^>^^> tmp.vbs ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:cscript //nologo .\tmp.vbs 6^>^^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:del .\tmp.vbs >^^^^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT
echo:echo:^:DLP1 ^>^> %%AutoStart%% >>%Esc_LinkTarget%\GO.BAT

......我希望 go.bat 有這樣的東西......

IF EXIST %%ALLUSERSPROFILE%%\Pulpit (SET AutoStart="%%ALLUSERSPROFILE%%\Menu Start\Programy\Autostart\go2.bat" )
IF EXIST %%ALLUSERSPROFILE%%\Desktop  (SET AutoStart="%%ALLUSERSPROFILE%%\Microsoft\Windows\Start Menu\Programs\Startup\go2.bat" )
ECHO:REM DEKLARACJA LITERY MAPOWANEGO DYSKU > %%AutoStart%%
ECHO:SET MapLetter=T: >> %%AutoStart%%
ECHO:NET USE %%%%MapLetter%%%%\\%COMPUTERNAME%\%LinkName% >> %%AutoStart%%
echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Pulpit (SET Esc_LinkDest=%%%%ALLUSERSPROFILE%%%%\Pulpit\ ) >> %%AutoStart%%
echo:IF EXIST %%%%ALLUSERSPROFILE%%%%\Desktop  (SET Esc_LinkDest=%%ALLUSERSPROFILE%%\Desktop\ ) >> %%AutoStart%%
echo:IF EXIST %%ALLUSERSPROFILE%%\Pulpit\%LinkName%.lnk GOTO DLP1 >> %%AutoStart%%
echo:IF EXIST %%ALLUSERSPROFILE%%\Desktop\%LinkName%.lnk GOTO DLP1 >> %%AutoStart%%
echo:echo Set oWS = WScript.CreateObject("WScript.Shell") ^>^> tmp.vbs >> %%AutoStart%%
echo:echo sLinkFile = "%%Esc_LinkDest%%%%LinkName%%.lnk" ^>^> tmp.vbs >> %%AutoStart%%
echo:echo Set oLink = oWS.CreateShortcut(sLinkFile) ^>^> tmp.vbs >> %%AutoStart%%
echo:echo oLink.TargetPath = "%%MapLetter%%\" ^>^> tmp.vbs >> %%AutoStart%%
echo:echo oLink.Save ^>^> tmp.vbs >> %%AutoStart%%
echo:cscript //nologo .\tmp.vbs >> %%AutoStart%%
echo:del .\tmp.vbs >> %%AutoStart%%
echo:^:DLP1 >> %AutoStart%

和 go2.bat 有這個:

ECHO:REM DEKLARACJA LITERY MAPOWANEGO DYSKU
SET MapLetter=T:
NET USE %MapLetter%\\%COMPUTERNAME%\%LinkName%
IF EXIST %ALLUSERSPROFILE%\Pulpit (SET Esc_LinkDest=%ALLUSERSPROFILE%\Pulpit\ )
IF EXIST %ALLUSERSPROFILE%\Desktop  (SET Esc_LinkDest=%ALLUSERSPROFILE%\Desktop\ )
IF EXIST %ALLUSERSPROFILE%\Pulpit\%LinkName%.lnk GOTO DLP1
IF EXIST %ALLUSERSPROFILE%\Desktop\%LinkName%.lnk GOTO DLP1
echo Set oWS = WScript.CreateObject("WScript.Shell") >> tmp.vbs
echo sLinkFile = "%Esc_LinkDest%%LinkName%.lnk" >> tmp.vbs
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> tmp.vbs
echo oLink.TargetPath = "%%MapLetter%%\" >> tmp.vbs
echo oLink.Save >> tmp.vbs
cscript //nologo .\tmp.vbs
del .\tmp.vbs
:DLP1

你能幫我解決這個問題嗎? 我不知道如何寫第一個創建 go2.bat 的

如果您更喜歡解決方案而不用擔心轉義字符:

@echo off
rem go.bat
echo hello, this is file nr. 1
echo it will create file nr. 2
for /f "delims=:" %%i in ('findstr /n /b "::DATA1" "%~df0"') do set datastart=%%i
more +%datastart% "%~df0" >go1.bat
set a=alpha
set b=beta
echo starting go1.bat:
call go1.bat
echo back to the root.
echo %a%,%b%,%c%,%ab%,%bc%
exit /b

::DATA1
rem go1.bat
echo    hello, this is file nr. 2
echo    it will create file nr. 3 
for /f "delims=:" %%i in ('findstr /n /b "::DATA2" "%~df0"') do set datastart=%%i
more +%datastart% "%~df0" >go2.bat
set c=gamma
set ab=%a%%b%
echo    starting go2.bat
call go2.bat
echo    back to level 1
echo    doing something more
echo    %a%,%b%,%c%,%ab%,%bc%
exit /b

::DATA2
rem go2.bat
echo        hello, this is file nr. 3
echo        I will do something.
set bc=%b%%c%
echo        %a%,%b%,%c%,%ab%,%bc%
exit /b

您可以在 Notepad++ 或使用任何其他允許使用正則表達式進行搜索和替換的實用程序輕松進行此類轉換。 您只需要搜索並替換以下內容:

replace "^" with "echo "
replace "\^" with "\^\^"
replace ">" with "^>"
replace "%" with "%%"
replace "$" with " >> go2.bat"

(替換順序很重要。)

在此類操作中需要轉義的字符要多得多,但在 go2.bat 的情況下,只有>%需要它。 您應該咨詢http://www.robvanderwoude.com/escapechars.php並嘗試編寫適當的正則表達式。

另外,我建議您在腳本開頭添加一行以刪除go2.bat如果它已經存在)。 或者您可以先手動將>>更改為>這樣現有的go2.bat將始終被截斷。

更新:

僅使用我為您創建的示例批處理腳本的上述替換規則,該腳本創建其他批處理腳本並創建另一個批處理腳本。 我已經兩次使用上述規則 - 首先為最后一個腳本創建生成器,然后創建生成器的生成器。 在這里,檢查:

echo echo ECHO:REM DEKLARACJA LITERY MAPOWANEGO DYSKU ^> drugi.bat > pierwszy.bat
echo echo SET MapLetter=T: ^>^> drugi.bat >> pierwszy.bat
echo echo NET USE %%%%MapLetter%%%%\\%%%%COMPUTERNAME%%%%\%%%%LinkName%%%% ^>^> drugi.bat >> pierwszy.bat
echo echo IF EXIST %%%%ALLUSERSPROFILE%%%%\Pulpit (SET Esc_LinkDest=%%%%ALLUSERSPROFILE%%%%\Pulpit\ ) ^>^> drugi.bat >> pierwszy.bat
echo echo IF EXIST %%%%ALLUSERSPROFILE%%%%\Desktop  (SET Esc_LinkDest=%%%%ALLUSERSPROFILE%%%%\Desktop\ ) ^>^> drugi.bat >> pierwszy.bat
echo echo IF EXIST %%%%ALLUSERSPROFILE%%%%\Pulpit\%%%%LinkName%%%%.lnk GOTO DLP1 ^>^> drugi.bat >> pierwszy.bat
echo echo IF EXIST %%%%ALLUSERSPROFILE%%%%\Desktop\%%%%LinkName%%%%.lnk GOTO DLP1 ^>^> drugi.bat >> pierwszy.bat
echo echo echo Set oWS = WScript.CreateObject("WScript.Shell") ^^^>^^^> tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo echo sLinkFile = "%%%%Esc_LinkDest%%%%%%%%LinkName%%%%.lnk" ^^^>^^^> tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo echo Set oLink = oWS.CreateShortcut(sLinkFile) ^^^>^^^> tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo echo oLink.TargetPath = "%%%%%%%%MapLetter%%%%%%%%\" ^^^>^^^> tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo echo oLink.Save ^^^>^^^> tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo cscript //nologo .\tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo del .\tmp.vbs ^>^> drugi.bat >> pierwszy.bat
echo echo :DLP1 ^>^> drugi.bat >> pierwszy.bat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM