File batch menyertakan file eksternal untuk variabel


Jawaban:


133

Catatan: Saya mengasumsikan file batch Windows karena kebanyakan orang tampaknya tidak menyadari bahwa ada perbedaan yang signifikan dan secara membabi buta memanggil semuanya dengan teks abu-abu pada DOS latar belakang hitam. Namun demikian, varian pertama harus bekerja di DOS juga.

Konfigurasi yang dapat dijalankan

Cara termudah untuk melakukannya adalah dengan meletakkan variabel di file batch itu sendiri, masing-masing dengan setpernyataannya sendiri :

set var1=value1
set var2=value2
...

dan dalam kelompok utama Anda:

call config.cmd

Tentu saja, itu juga memungkinkan variabel dibuat secara bersyarat atau bergantung pada aspek sistem, jadi ini cukup serbaguna. Namun, kode arbitrer dapat berjalan di sana dan jika ada kesalahan sintaksis, kumpulan utama Anda juga akan keluar. Di dunia UNIX ini tampaknya cukup umum, terutama untuk cangkang. Dan jika Anda memikirkannya, autoexec.battidak ada yang lain.

Pasangan kunci / nilai

Cara lain adalah dengan var=valueberpasangan di file konfigurasi:

var1=value1
var2=value2
...

Anda kemudian dapat menggunakan cuplikan berikut untuk memuatnya:

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

Ini menggunakan trik yang sama seperti sebelumnya, yaitu hanya menggunakan setpada setiap baris. Tanda kutip yang ada untuk menghindari hal-hal seperti <, >, &, |. Namun, mereka sendiri akan rusak saat tanda kutip digunakan dalam input. Anda juga harus selalu berhati-hati saat memproses data lebih lanjut dalam variabel yang disimpan dengan karakter seperti itu.

Secara umum, secara otomatis keluar dari input yang sewenang-wenang agar tidak menimbulkan sakit kepala atau masalah dalam file batch tampaknya sangat tidak mungkin bagi saya. Setidaknya saya belum menemukan cara untuk melakukannya. Tentu saja, dengan solusi pertama Anda mendorong tanggung jawab itu ke orang yang menulis file konfigurasi.


Itu tidak berhasil untuk saya, dapatkah Anda memeriksa: stackoverflow.com/questions/46147450/…
Naguib Ihab

35

Jika file konfigurasi eksternal juga merupakan file batch yang valid, Anda dapat menggunakan:

call externalconfig.bat

di dalam skrip Anda. Coba buat a.bat berikut:

@echo off
call b.bat
echo %MYVAR%

dan b.bat:

set MYVAR=test

Menjalankan a.bat akan menghasilkan keluaran:

test

Itu tidak berhasil untuk saya, dapatkah Anda memeriksa: stackoverflow.com/questions/46147450/…
Naguib Ihab

Jika menggunakan file konfigurasi dalam skrip lain secara paralel (memanggilnya dengan call, yang merupakan sinkron btw), dikatakan "proses tidak dapat mengakses file karena sedang digunakan" dan tidak dapat dipanggil.
domih

2

Batch menggunakan kurang dari dan lebih besar dari tanda kurung sebagai pipa input dan output.

>file.ext

Menggunakan hanya satu braket keluaran seperti di atas akan menimpa semua informasi dalam file itu.

>>file.ext

Menggunakan braket kanan ganda akan menambahkan baris berikutnya ke file.

(
echo
echo
)<file.ext

Ini akan mengeksekusi parameter berdasarkan baris file. Dalam hal ini, kami menggunakan dua baris yang akan diketik menggunakan "echo". Tanda kurung kiri menyentuh tanda kurung kurung kanan berarti informasi dari file tersebut akan disalurkan ke baris tersebut.

Saya telah menyusun file baca / tulis hanya contoh. Di bawah ini adalah file yang dipecah menjadi beberapa bagian untuk menjelaskan apa yang dilakukan setiap bagian.

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

SRU dapat berupa apa saja dalam contoh ini. Kami sebenarnya mengaturnya untuk mencegah crash jika Anda menekan Enter terlalu cepat.

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: 

Sekarang, kita perlu menulis variabel ke file.

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

Saya menggunakan .cdb sebagai kependekan dari "Command Database". Anda dapat menggunakan ekstensi apa pun. Bagian selanjutnya adalah menguji kode dari awal. Kami tidak ingin menggunakan variabel set yang dijalankan di awal file, kami sebenarnya ingin mereka memuat DARI settings.cdb yang baru saja kami tulis.

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

Jadi, kami baru saja menyalurkan dua baris informasi pertama yang Anda tulis di awal file (yang Anda memiliki opsi untuk melewati pengaturan baris untuk memeriksa untuk memastikannya berfungsi) untuk mengatur variabel input dan input2.

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

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

Ini menampilkan informasi yang disetel saat settings.cdb disalurkan ke dalam tanda kurung. Sebagai motivator kerja ekstra yang baik, menekan enter dan menyetel nilai default yang kita tetapkan sebelumnya sebagai "1" akan mengembalikan pesan pekerjaan yang baik. Penggunaan pipa braket berlaku dua arah, dan jauh lebih mudah daripada menyetel barang "UNTUK". :)


1

Jadi, Anda hanya perlu melakukan ini dengan benar ?:

@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

Keluaran:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

Teknik yang diuraikan di atas juga dapat digunakan untuk berbagi variabel di antara beberapa file batch.

Sumber: http://www.incodesystems.com/products/batchfi1.htm


0

Subjek agak lama tetapi saya memiliki pertanyaan yang sama beberapa hari yang lalu dan saya mendapatkan ide lain (mungkin seseorang masih akan menganggapnya berguna)

Misalnya, Anda dapat membuat config.bat dengan subjek berbeda (keluarga, ukuran, warna, hewan) dan menerapkannya satu per satu dalam urutan apa pun yang Anda inginkan dalam skrip batch Anda:

@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

Setelah itu, Anda dapat menggunakannya di mana saja dengan memanggil sepenuhnya dengan 'call config.bat all' atau hanya memanggil sebagian saja (lihat contoh di bawah) Ide di sini adalah terkadang lebih berguna ketika Anda memiliki opsi untuk tidak memanggil semuanya di sekali. Beberapa variabel mungkin Anda belum ingin dipanggil sehingga Anda dapat memanggilnya nanti.

Contoh 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

Semoga ini membantu cara orang lain membantu saya di sini dengan jawaban mereka.

Versi singkat di atas:

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

Selamat siang.


-2

Jangan lupakan parameter lama yang bagus. Saat memulai file * .bat atau * .cmd Anda dapat menambahkan hingga sembilan parameter setelah nama file perintah:

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

Contoh skrip

Myscript.bat bisa jadi seperti ini:

@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

Contoh keluaran

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

Ketika mencoba menggunakan metode dengan konfigurasi yang dapat dikecualikan, saya perhatikan bahwa itu mungkin berfungsi atau mungkin TIDAK berfungsi tergantung di mana di skrip berada panggilan:

hubungi config.cmd

Aku tahu itu tidak masuk akal, tapi bagiku itu fakta. Ketika "call config.cmd" terletak di bagian atas skrip, itu berfungsi, tetapi jika lebih jauh dalam skrip itu tidak.

Dengan tidak berfungsi, maksud saya variabel tidak disetel ke skrip pemanggil.

Sangat sangat aneh !!!!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.