Tệp hàng loạt bao gồm tệp bên ngoài cho các biến


Câu trả lời:


133

Lưu ý: Tôi giả định rằng các tệp hàng loạt của Windows vì hầu hết mọi người dường như không biết rằng có sự khác biệt đáng kể và chỉ gọi mọi thứ một cách mù quáng bằng văn bản màu xám trên nền DOS nền đen. Tuy nhiên, biến thể đầu tiên cũng sẽ hoạt động trong DOS.

Cấu hình thực thi

Cách dễ nhất để làm điều này là chỉ cần đặt các biến vào một tệp loạt, mỗi biến có setcâu lệnh riêng :

set var1=value1
set var2=value2
...

và trong lô chính của bạn:

call config.cmd

Tất nhiên, điều đó cũng cho phép các biến được tạo theo điều kiện hoặc tùy thuộc vào các khía cạnh của hệ thống, vì vậy nó khá linh hoạt. Tuy nhiên, mã tùy ý có thể chạy ở đó và nếu có lỗi cú pháp, thì lô chính của bạn cũng sẽ thoát. Trong thế giới UNIX, điều này dường như khá phổ biến, đặc biệt là đối với shell. Và nếu bạn nghĩ về nó, autoexec.batkhông có gì khác.

Các cặp khóa / giá trị

Một cách khác sẽ là một số loại var=valuecặp trong tệp cấu hình:

var1=value1
var2=value2
...

Sau đó, bạn có thể sử dụng đoạn mã sau để tải chúng:

for /f "delims=" %%x in (config.txt) do (set "%%x")

Điều này sử dụng một thủ thuật tương tự như trước đây, cụ thể là chỉ sử dụng settrên mỗi dòng. Có dấu ngoặc kép đang có để thoát khỏi những thứ như <, >, &, |. Tuy nhiên, chúng sẽ tự ngắt khi sử dụng dấu ngoặc kép trong đầu vào. Ngoài ra, bạn luôn cần phải cẩn thận khi xử lý thêm dữ liệu trong các biến được lưu trữ với các ký tự như vậy.

Nói chung, tự động thoát đầu vào tùy ý để không gây đau đầu hoặc vấn đề trong các tệp hàng loạt dường như là điều không thể đối với tôi. Ít nhất thì tôi vẫn chưa tìm ra cách để làm như vậy. Tất nhiên, với giải pháp đầu tiên, bạn đang đẩy trách nhiệm đó cho người viết tệp cấu hình.


Đó không làm việc cho tôi, bạn có thể xin vui lòng kiểm tra: stackoverflow.com/questions/46147450/...
Naguib Ihab

35

Nếu tệp cấu hình bên ngoài cũng là tệp lô hợp lệ, bạn chỉ có thể sử dụng:

call externalconfig.bat

bên trong tập lệnh của bạn. Hãy thử tạo a.bat sau:

@echo off
call b.bat
echo %MYVAR%

và b.bat:

set MYVAR=test

Chạy a.bat sẽ tạo ra đầu ra:

test

Đó không làm việc cho tôi, bạn có thể xin vui lòng kiểm tra: stackoverflow.com/questions/46147450/...
Naguib Ihab

Nếu sử dụng song song tệp cấu hình trong một tập lệnh khác (gọi nó bằng call, là btw đồng bộ), nó cho biết "tiến trình không thể truy cập tệp vì nó đang được sử dụng" và không thể được gọi.
domih

2

Batch sử dụng dấu ngoặc nhỏ hơn và lớn hơn làm đường ống đầu vào và đầu ra.

>file.ext

Chỉ sử dụng một dấu ngoặc đầu ra như trên sẽ ghi đè lên tất cả thông tin trong tệp đó.

>>file.ext

Sử dụng dấu ngoặc kép bên phải sẽ thêm dòng tiếp theo vào tệp.

(
echo
echo
)<file.ext

Điều này sẽ thực thi các tham số dựa trên các dòng của tệp. Trong trường hợp này, chúng tôi đang sử dụng hai dòng sẽ được nhập bằng "echo". Dấu ngoặc trái chạm vào dấu ngoặc bên phải có nghĩa là thông tin từ tệp đó sẽ được chuyển vào các dòng đó.

Tôi đã biên dịch một tệp chỉ đọc / ghi ví dụ. Dưới đây là tệp được chia thành các phần để giải thích những gì mỗi phần làm.

@echo off
echo TEST R/W
set SRU=0

SRU có thể là bất kỳ thứ gì trong ví dụ này. Chúng tôi thực sự đang thiết lập nó để ngăn sự cố nếu bạn nhấn Enter quá nhanh.

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: 

Bây giờ, chúng ta cần ghi các biến vào một tệp.

(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause

Tôi sử dụng .cdb làm dạng rút gọn cho "Cơ sở dữ liệu lệnh". Bạn có thể sử dụng bất kỳ phần mở rộng nào. Phần tiếp theo là kiểm tra mã từ đầu. Chúng tôi không muốn sử dụng các biến tập hợp đã được chạy ở đầu tệp, chúng tôi thực sự muốn chúng tải TỪ phần settings.cdb mà chúng tôi vừa viết.

:read
(
set /p input=
set /p input2=
)<settings.cdb

Vì vậy, chúng tôi chỉ gộp hai dòng thông tin đầu tiên mà bạn đã viết ở đầu tệp (bạn có tùy chọn bỏ qua việc đặt các dòng để kiểm tra để đảm bảo rằng nó đang hoạt động) để đặt các biến đầu vào và đầu vào2.

echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit

:newecho
echo If you can see this, good job!
pause
exit

Điều này hiển thị thông tin đã được đặt trong khi settings.cdb được đưa vào dấu ngoặc đơn. Là một động lực thúc đẩy công việc tốt hơn, nhấn enter và đặt các giá trị mặc định mà chúng tôi đặt trước đó là "1" sẽ trả về thông báo công việc tốt. Sử dụng các đường ống khung có cả hai cách và dễ dàng hơn nhiều so với việc đặt nội dung "CHO". :)


1

Vì vậy, bạn chỉ cần làm điều này phải không ?:

@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

Đầu ra:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

Kỹ thuật nêu trên cũng có thể được sử dụng để chia sẻ các biến giữa nhiều tệp hàng loạt.

Nguồn: http://www.incodesystems.com/products/batchfi1.htm


0

Kinda chủ đề cũ nhưng tôi đã có cùng một câu hỏi cách đây vài ngày và tôi đã nảy ra một ý tưởng khác (có thể ai đó vẫn sẽ thấy nó hữu ích)

Ví dụ: bạn có thể tạo một config.bat với các chủ thể khác nhau (gia đình, kích thước, màu sắc, động vật) và áp dụng chúng riêng lẻ theo thứ tự bất kỳ ở đâu bạn muốn trong các tập lệnh hàng loạt của mình:

@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

Sau đó, bạn có thể sử dụng nó ở bất kỳ đâu bằng cách gọi đầy đủ bằng 'call config.bat all' hoặc chỉ gọi các phần của nó (xem ví dụ dưới đây) Ý tưởng ở đây là đôi khi tiện dụng hơn khi bạn có tùy chọn không gọi mọi thứ tại Một lần. Một số biến có thể bạn chưa muốn được gọi để bạn có thể gọi chúng sau.

Ví dụ 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

Hy vọng nó sẽ giúp ích cho cách những người khác giúp tôi ở đây với câu trả lời của họ.

Một phiên bản ngắn của phần trên:

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

Ngày tốt.


-2

Đừng quên các thông số cũ tốt. Khi khởi động tệp * .bat hoặc * .cmd, bạn có thể thêm tối đa chín tham số sau tên tệp lệnh:

call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"

Tập lệnh mẫu

Myscript.bat có thể là một cái gì đó như thế này:

@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

Ví dụ đầu ra

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

Trong khi cố gắng sử dụng phương thức với cấu hình có thể chạy được, tôi nhận thấy rằng nó có thể hoạt động hoặc có thể KHÔNG hoạt động tùy thuộc vào vị trí trong tập lệnh được đặt lệnh gọi:

gọi config.cmd

Tôi biết nó không có ý nghĩa gì, nhưng đối với tôi đó là một sự thật. Khi "call config.cmd" nằm ở đầu tập lệnh, nó hoạt động, nhưng nếu xa hơn trong tập lệnh thì không.

Bởi không hoạt động, ý tôi là biến không được đặt ngoài tập lệnh gọi.

Rất rất lạ !!!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.