ฉันมีไฟล์แบตช์และต้องการรวมไฟล์ภายนอกที่มีตัวแปรบางตัว (พูดถึงตัวแปรการกำหนดค่า) เป็นไปได้ไหม?
ฉันมีไฟล์แบตช์และต้องการรวมไฟล์ภายนอกที่มีตัวแปรบางตัว (พูดถึงตัวแปรการกำหนดค่า) เป็นไปได้ไหม?
คำตอบ:
หมายเหตุ:ฉันสมมติว่าไฟล์แบตช์ของ Windows ดูเหมือนว่าคนส่วนใหญ่จะไม่ทราบว่ามีความแตกต่างที่สำคัญและเพียงแค่เรียกทุกอย่างด้วยข้อความสีเทาบน DOS พื้นหลังสีดำ อย่างไรก็ตามตัวแปรแรกควรทำงานใน DOS ด้วยเช่นกัน
วิธีที่ง่ายที่สุดคือใส่ตัวแปรลงในไฟล์แบตช์ด้วยตัวเองโดยแต่ละตัวแปรจะมีset
คำสั่งของตัวเอง:
set var1=value1
set var2=value2
...
และในชุดหลักของคุณ:
call config.cmd
แน่นอนว่ายังช่วยให้สามารถสร้างตัวแปรตามเงื่อนไขหรือขึ้นอยู่กับลักษณะต่างๆของระบบดังนั้นจึงค่อนข้างหลากหลาย อย่างไรก็ตามรหัสที่กำหนดเองสามารถทำงานได้ที่นั่นและหากมีข้อผิดพลาดทางไวยากรณ์แบตช์หลักของคุณก็จะออกด้วยเช่นกัน ในโลก UNIX สิ่งนี้ดูเหมือนจะเป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งสำหรับเปลือกหอย และถ้าคุณคิดเกี่ยวกับมันautoexec.bat
ก็ไม่มีอะไรอื่น
อีกวิธีหนึ่งคือvar=value
คู่บางประเภทในไฟล์กำหนดค่า:
var1=value1
var2=value2
...
จากนั้นคุณสามารถใช้ตัวอย่างข้อมูลต่อไปนี้เพื่อโหลดได้:
for /f "delims=" %%x in (config.txt) do (set "%%x")
สิ่งนี้ใช้เคล็ดลับที่คล้ายกันเหมือนเดิมกล่าวคือใช้เพียงแค่set
แต่ละบรรทัด คำพูดจะมีการหลบหนีสิ่งที่ชอบ<
, >
, ,&
|
อย่างไรก็ตามพวกเขาจะพังเมื่อใช้เครื่องหมายคำพูดในการป้อนข้อมูล นอกจากนี้คุณต้องระมัดระวังในการประมวลผลข้อมูลเพิ่มเติมในตัวแปรที่จัดเก็บด้วยอักขระดังกล่าว
โดยทั่วไปแล้วการหลีกเลี่ยงการป้อนข้อมูลโดยพลการโดยอัตโนมัติเพื่อไม่ให้เกิดอาการปวดหัวหรือปัญหาในไฟล์แบตช์ดูเหมือนจะเป็นไปไม่ได้สำหรับฉัน อย่างน้อยฉันก็ยังไม่พบวิธีที่จะทำเช่นนั้น แน่นอนว่าด้วยวิธีแก้ปัญหาแรกที่คุณต้องผลักดันความรับผิดชอบนั้นให้กับคนที่เขียนไฟล์กำหนดค่า
หากไฟล์คอนฟิกูเรชันภายนอกเป็นไฟล์แบตช์ที่ถูกต้องคุณสามารถใช้:
call externalconfig.bat
ภายในสคริปต์ของคุณ ลองสร้าง a.bat ต่อไปนี้:
@echo off
call b.bat
echo %MYVAR%
และ b.bat:
set MYVAR=test
การรัน a.bat ควรสร้างเอาต์พุต:
test
call
ซึ่งเป็น btw synchronous) จะระบุว่า "กระบวนการไม่สามารถเข้าถึงไฟล์ได้เนื่องจากมีการใช้งาน" และไม่สามารถเรียกใช้งานได้
แบทช์ใช้วงเล็บน้อยกว่าและมากกว่าเป็นท่ออินพุตและเอาต์พุต
>file.ext
การใช้เพียงขายึดเอาต์พุตเดียวเหมือนด้านบนจะเขียนทับข้อมูลทั้งหมดในไฟล์นั้น
>>file.ext
การใช้วงเล็บปีกกาคู่ขวาจะเพิ่มบรรทัดถัดไปให้กับไฟล์
(
echo
echo
)<file.ext
การดำเนินการนี้จะเรียกใช้พารามิเตอร์ตามบรรทัดของไฟล์ ในกรณีนี้เรากำลังใช้สองบรรทัดที่จะพิมพ์โดยใช้ "echo" วงเล็บด้านซ้ายแตะวงเล็บวงเล็บด้านขวาหมายความว่าข้อมูลจากไฟล์นั้นจะถูกส่งไปยังบรรทัดเหล่านั้น
ฉันได้รวบรวมไฟล์อ่าน / เขียนตัวอย่างเท่านั้น ด้านล่างนี้คือไฟล์ที่แบ่งออกเป็นส่วนต่างๆเพื่ออธิบายว่าแต่ละส่วนทำหน้าที่อะไร
@echo off
echo TEST R/W
set SRU=0
SRU สามารถเป็นอะไรก็ได้ในตัวอย่างนี้ เรากำลังตั้งค่าเพื่อป้องกันการขัดข้องหากคุณกด Enter เร็วเกินไป
set /p SRU=Skip Save? (y):
if %SRU%==y goto read
set input=1
set input2=2
set /p input=INPUT:
set /p input2=INPUT2:
ตอนนี้เราต้องเขียนตัวแปรลงในไฟล์
(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause
ฉันใช้. cdb เป็นรูปแบบย่อสำหรับ "ฐานข้อมูลคำสั่ง" คุณสามารถใช้นามสกุลใดก็ได้ ส่วนถัดไปคือการทดสอบโค้ดตั้งแต่เริ่มต้น เราไม่ต้องการใช้ตัวแปรชุดที่เรียกใช้ที่จุดเริ่มต้นของไฟล์เราต้องการให้โหลดจากการตั้งค่า cdb ที่เราเพิ่งเขียนไป
:read
(
set /p input=
set /p input2=
)<settings.cdb
ดังนั้นเราจึงวางข้อมูลสองบรรทัดแรกที่คุณเขียนไว้ที่จุดเริ่มต้นของไฟล์ (ซึ่งคุณมีตัวเลือกในการข้ามการตั้งค่าบรรทัดเพื่อตรวจสอบว่าใช้งานได้) เพื่อตั้งค่าตัวแปรของอินพุตและอินพุต 2
echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit
:newecho
echo If you can see this, good job!
pause
exit
แสดงข้อมูลที่ถูกตั้งค่าในขณะที่ settings.cdb ถูกส่งไปยังวงเล็บ ในฐานะผู้สร้างแรงจูงใจในการทำงานที่ดีการกด Enter และตั้งค่าเริ่มต้นที่เราตั้งไว้ก่อนหน้านี้เป็น "1" จะส่งคืนข้อความงานที่ดี การใช้ท่อยึดสามารถทำได้ทั้งสองวิธีและง่ายกว่าการตั้งค่า "FOR" มาก :)
คุณต้องทำสิ่งนี้ใช่ไหม:
@echo off
echo text shizzle
echo.
echo pause^>nul (press enter)
pause>nul
REM writing to file
(
echo XD
echo LOL
)>settings.cdb
cls
REM setting the variables out of the file
(
set /p input=
set /p input2=
)<settings.cdb
cls
REM echo'ing the variables
echo variables:
echo %input%
echo %input2%
pause>nul
if %input%==XD goto newecho
DEL settings.cdb
exit
:newecho
cls
echo If you can see this, good job!
DEL settings.cdb
pause>nul
exit
:: savevars.bat
:: Use $ to prefix any important variable to save it for future runs.
@ECHO OFF
SETLOCAL
REM Load variables
IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A"
REM Change variables
IF NOT DEFINED $RunCount (
SET $RunCount=1
) ELSE SET /A $RunCount+=1
REM Display variables
SET $
REM Save variables
SET $>config.txt
ENDLOCAL
PAUSE
EXIT /B
เอาท์พุต:
$ RunCount = 1
$ RunCount = 2
$ RunCount = 3
เทคนิคที่อธิบายไว้ข้างต้นยังสามารถใช้เพื่อแบ่งปันตัวแปรระหว่างไฟล์แบตช์หลายไฟล์
เป็นเรื่องเก่า แต่ฉันมีคำถามเดียวกันเมื่อสองสามวันก่อนและฉันก็คิดอีกอย่างหนึ่ง (อาจจะมีคนคิดว่ามันมีประโยชน์)
ตัวอย่างเช่นคุณสามารถสร้าง config.bat โดยใช้หัวเรื่องต่างๆ (ตระกูลขนาดสีสัตว์) และนำไปใช้ทีละลำดับตามที่คุณต้องการในสคริปต์แบทช์ของคุณ:
@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=
rem Go to the label with the parameter you selected
goto :config_%1
REM This next line is just to go to end of file
REM in case that the parameter %1 is not set
goto :end
REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end
:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end
:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end
:end
หลังจากนั้นคุณสามารถใช้งานได้ทุกที่โดยโทรเต็มด้วย 'call config.bat all' หรือเรียกเฉพาะบางส่วน (ดูตัวอย่างการร้อง) แนวคิดในที่นี้คือบางครั้งมีประโยชน์มากกว่าเมื่อคุณมีตัวเลือกที่จะไม่โทรทุกอย่างที่ ครั้งเดียว. ตัวแปรบางตัวคุณอาจยังไม่ต้องการให้เรียกใช้เพื่อให้สามารถเรียกใช้ในภายหลังได้
ตัวอย่าง test.bat
@echo off
rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
call config.bat animals
echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%
rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%
call config.bat color
echo His lucky color is %first_color% even if %second_color% is also nice.
echo.
pause
หวังว่ามันจะช่วยให้คนอื่นช่วยฉันด้วยคำตอบที่นี่
เวอร์ชันสั้น ๆ ข้างต้น:
config.bat
@echo off
set config_all_selected=
goto :config_%1
goto :end
:config_all
set config_all_selected=1
:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end
:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end
:end
test.bat
@echo off
call config.bat size
echo My birthday present had a width of %width% and a height of %height%
call config.bat family
echo %father% and %mother% have a daughter named %daughter%
echo.
pause
ขอให้เป็นวันที่ดี.
อย่าลืมพารามิเตอร์เก่า ๆ ที่ดี เมื่อเริ่มต้นไฟล์ * .bat หรือ * .cmd ของคุณคุณสามารถเพิ่มพารามิเตอร์ได้ถึงเก้าพารามิเตอร์หลังชื่อไฟล์คำสั่ง:
call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"
myscript.bat อาจเป็นดังนี้:
@Echo Off
Echo The path of this scriptfile %~0
Echo The name of this scriptfile %~n0
Echo The extension of this scriptfile %~x0
Echo.
If "%~2"=="" (
Echo Parameter missing, quitting.
GoTo :EOF
)
If Not Exist "%~1" (
Echo File does not exist, quitting.
GoTo :EOF
)
Echo Going to %~2 this file: %~1
%~2 "%~1"
If %errorlevel% NEQ 0 (
Echo Failed to %~2 the %~1.
)
@Echo On
c:\>c:\bats\myscript.bat \\server\path\x.txt type
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat
Going to type this file: \\server\path\x.txt
This is the content of the file:
Some alphabets: ABCDEFG abcdefg
Some numbers: 1234567890
c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f "
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat
Going to del /f this file: \\server\path\x.txt
c:\>
ในขณะที่พยายามใช้วิธีการที่มีการกำหนดค่า excutable ฉันสังเกตเห็นว่าอาจใช้งานได้หรืออาจไม่ทำงานขึ้นอยู่กับตำแหน่งในสคริปต์ที่เรียก:
โทร config.cmd
ฉันรู้ว่ามันไม่ได้ทำให้รู้สึกอะไร แต่สำหรับฉันมันคือความจริง เมื่อ "call config.cmd" อยู่ที่ด้านบนของสคริปต์จะใช้งานได้ แต่ถ้าอยู่ในสคริปต์ต่อไปมันจะไม่ทำงาน
ไม่ทำงานฉันหมายความว่าตัวแปรไม่ได้ถูกตั้งค่าจากสคริปต์การโทร
แปลกมาก !!!!