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


Tôi có một tập tin batch và tôi muốn bao gồm các tập tin bên ngoài có chứa một số biến (nói biến cấu hình). Có thể không?


76
2018-05-04 08:41


gốc




Các câu trả lời:


Chú thích: Tôi giả sử tập tin batch 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ỉ mù quáng gọi tất cả mọi thứ với văn bản màu xám trên nền đen DOS. Tuy nhiên, biến thể đầu tiên cũng 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 trong một tập tin thực thi, mỗi biến riêng của nó set tuyên bố:

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 ra có điều kiện hoặc tùy thuộc vào các khía cạnh của hệ thống, do đó, 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 có vẻ khá phổ biến, đặc biệt là đối với các hệ vỏ. Và nếu bạn nghĩ về nó, autoexec.bat không có gì khác.

Cặp khóa / giá trị

Một cách khác sẽ là một loại var=value cặ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 mẹo tương tự như trước đây, cụ thể là chỉ sử dụng set trên mỗi dòng. Các dấu ngoặc kép ở đó để thoát khỏi những thứ như <, >, &, |. Tuy nhiên, chúng sẽ tự ngắt khi báo giá được sử dụng trong đầu vào. Ngoài ra, bạn luôn cần phải cẩn thận khi tiếp tục xử lý 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 ý để gây ra không đau đầu hoặc các vấn đề trong tập tin batch có vẻ khá không thể đối với tôi. Ít nhất tôi đã không tìm được 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 đó lên một tập tin cấu hình.


103
2018-05-04 08:47



Điều đó không hiệu quả đối với tôi, bạn có thể kiểm tra: stackoverflow.com/questions/46147450/… - Naguib Ihab


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 kịch bản của bạn. 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

29
2018-05-04 08:48



Điều đó không hiệu quả đối với tôi, bạn có thể kiểm tra: stackoverflow.com/questions/46147450/… - Naguib Ihab
Nếu sử dụng tệp cấu hình trong một tập lệnh khác song song (hãy gọi nó bằng call, đó là btw đồng bộ), nó nói "quá trình không thể truy cập tập tin becaues nó đang được sử dụng" và không thể được gọi. - domih


Hàng loạt sử dụng ít hơn và lớn hơn dấu ngoặc đơn như đầu vào và đầu ra ống.

>file.ext

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

>>file.ext

Sử dụng khung bên phải đôi sẽ thêm dòng tiếp theo vào tệp.

(
echo
echo
)<file.ext

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

Tôi đã biên soạn một tệp chỉ đọc / ghi mẫu. Dưới đây là tệp được chia nhỏ thành các phần để giải thích phần nào của từng phần.

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

SRU có thể là bất cứ điều gì trong ví dụ này. Chúng tôi đang thực sự thiết lập nó để ngăn chặ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 phải viết các biến vào một tập tin.

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

Tôi sử dụng .cdb như một hình thức ngắn cho "Cơ sở dữ liệu lệnh". Bạn có thể sử dụng bất kỳ tiện ích 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 đã được đặt ở đầu tệp, chúng tôi thực sự muốn chúng tải FROM 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 vừa tạo 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 các dòng để kiểm tra để đảm bảo nó hoạt động) để đặt các biến của đầ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 thiết lập trong khi settings.cdb được đưa vào dấu ngoặc đơn. Là một động lực làm việc tốt, nhấn enter và thiết lập các giá trị mặc định mà chúng ta thiết lập trước đó là "1" sẽ trả về một thông điệp công việc tốt. Sử dụng các đường ống khung đi theo cả hai cách, và dễ dàng hơn nhiều so với thiết lập các công cụ "FOR". :)


2
2017-07-23 20:29





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

1
2017-09-27 16:04



Thêm lời giải thích cùng với mẫu mã của bạn. - krsteeve


:: 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 được nêu ở trên cũng có thể được sử dụng để chia sẻ các biến giữa nhiều tập tin batch.

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


0
2017-11-25 05:26





Đừng quên những thông số cũ tốt. Khi bắt đầu tệp * .bat hoặc * .cmd của bạn, 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

Các 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

Kết quả ví dụ

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

-1
2018-04-27 12:11





Trong khi cố gắng sử dụng phương pháp với cấu hình có thể thay đổi đượ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 kịch bản được đặt cuộc gọi:

gọi config.cmd

Tôi biết nó không có bất kỳ cảm giác nào, nhưng đối với tôi đó là một sự thật. Khi "call config.cmd" nằm ở đầu kịch bản, nó hoạt động, nhưng nếu tiếp tục trong kịch bản nó không.

Bởi không hoạt động, tôi có nghĩa là các biến không được đặt un script gọi.

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


-2
2018-05-25 23:49