ไฟล์แบตช์รวมไฟล์ภายนอกสำหรับตัวแปร


98

ฉันมีไฟล์แบตช์และต้องการรวมไฟล์ภายนอกที่มีตัวแปรบางตัว (พูดถึงตัวแปรการกำหนดค่า) เป็นไปได้ไหม?


การใช้งานทุ่นระเบิด: stackoverflow.com/questions/46147450/…
Andry

คำตอบ:


132

หมายเหตุ:ฉันสมมติว่าไฟล์แบตช์ของ 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แต่ละบรรทัด คำพูดจะมีการหลบหนีสิ่งที่ชอบ<, >, ,& |อย่างไรก็ตามพวกเขาจะพังเมื่อใช้เครื่องหมายคำพูดในการป้อนข้อมูล นอกจากนี้คุณต้องระมัดระวังในการประมวลผลข้อมูลเพิ่มเติมในตัวแปรที่จัดเก็บด้วยอักขระดังกล่าว

โดยทั่วไปแล้วการหลีกเลี่ยงการป้อนข้อมูลโดยพลการโดยอัตโนมัติเพื่อไม่ให้เกิดอาการปวดหัวหรือปัญหาในไฟล์แบตช์ดูเหมือนจะเป็นไปไม่ได้สำหรับฉัน อย่างน้อยฉันก็ยังไม่พบวิธีที่จะทำเช่นนั้น แน่นอนว่าด้วยวิธีแก้ปัญหาแรกที่คุณต้องผลักดันความรับผิดชอบนั้นให้กับคนที่เขียนไฟล์กำหนดค่า


ที่ไม่ได้ผลสำหรับฉันโปรดตรวจสอบ: stackoverflow.com/questions/46147450/…
Naguib Ihab

35

หากไฟล์คอนฟิกูเรชันภายนอกเป็นไฟล์แบตช์ที่ถูกต้องคุณสามารถใช้:

call externalconfig.bat

ภายในสคริปต์ของคุณ ลองสร้าง a.bat ต่อไปนี้:

@echo off
call b.bat
echo %MYVAR%

และ b.bat:

set MYVAR=test

การรัน a.bat ควรสร้างเอาต์พุต:

test

มันไม่ได้ผลสำหรับฉันโปรดตรวจสอบ: stackoverflow.com/questions/46147450/…
Naguib Ihab

หากใช้ไฟล์ config ในสคริปต์อื่นแบบขนาน (เรียกด้วยcallซึ่งเป็น btw synchronous) จะระบุว่า "กระบวนการไม่สามารถเข้าถึงไฟล์ได้เนื่องจากมีการใช้งาน" และไม่สามารถเรียกใช้งานได้
domih

2

แบทช์ใช้วงเล็บน้อยกว่าและมากกว่าเป็นท่ออินพุตและเอาต์พุต

>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" มาก :)


1

คุณต้องทำสิ่งนี้ใช่ไหม:

@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

0
:: 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

เทคนิคที่อธิบายไว้ข้างต้นยังสามารถใช้เพื่อแบ่งปันตัวแปรระหว่างไฟล์แบตช์หลายไฟล์

ที่มา: http://www.incodesystems.com/products/batchfi1.htm


0

เป็นเรื่องเก่า แต่ฉันมีคำถามเดียวกันเมื่อสองสามวันก่อนและฉันก็คิดอีกอย่างหนึ่ง (อาจจะมีคนคิดว่ามันมีประโยชน์)

ตัวอย่างเช่นคุณสามารถสร้าง 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

ขอให้เป็นวันที่ดี.


-2

อย่าลืมพารามิเตอร์เก่า ๆ ที่ดี เมื่อเริ่มต้นไฟล์ * .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:\>

-3

ในขณะที่พยายามใช้วิธีการที่มีการกำหนดค่า excutable ฉันสังเกตเห็นว่าอาจใช้งานได้หรืออาจไม่ทำงานขึ้นอยู่กับตำแหน่งในสคริปต์ที่เรียก:

โทร config.cmd

ฉันรู้ว่ามันไม่ได้ทำให้รู้สึกอะไร แต่สำหรับฉันมันคือความจริง เมื่อ "call config.cmd" อยู่ที่ด้านบนของสคริปต์จะใช้งานได้ แต่ถ้าอยู่ในสคริปต์ต่อไปมันจะไม่ทำงาน

ไม่ทำงานฉันหมายความว่าตัวแปรไม่ได้ถูกตั้งค่าจากสคริปต์การโทร

แปลกมาก !!!!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.