Bir toplu iş dosyam var ve bazı değişkenleri içeren harici bir dosya eklemek istiyorum (yapılandırma değişkenlerini söyleyin). Mümkün mü?
Yanıtlar:
Not: Windows toplu iş dosyalarının çoğu insan önemli farklılıklar olduğunun farkında olmadığı ve her şeyi siyah arka plan DOS'ta gri metinle körü körüne çağırdığı için varsayıyorum. Bununla birlikte, ilk değişken DOS'ta da çalışmalıdır.
Bunu yapmanın en kolay yolu, değişkenleri her biri kendi set
ifadesine sahip bir toplu iş dosyasına koymaktır :
set var1=value1
set var2=value2
...
ve ana partinizde:
call config.cmd
Elbette bu, değişkenlerin koşullu olarak veya sistemin yönlerine bağlı olarak oluşturulmasını da sağlar, bu nedenle oldukça çok yönlüdür. Bununla birlikte, burada rastgele kod çalıştırılabilir ve bir sözdizimi hatası varsa, ana grubunuz da çıkacaktır. UNIX dünyasında bu, özellikle mermiler için oldukça yaygın görünüyor. Ve eğer düşünürsen, autoexec.bat
başka bir şey değil.
Başka bir yol var=value
, yapılandırma dosyasındaki bir tür çift olabilir:
var1=value1
var2=value2
...
Daha sonra bunları yüklemek için aşağıdaki parçacığı kullanabilirsiniz:
for /f "delims=" %%x in (config.txt) do (set "%%x")
Bu, önceki gibi benzer bir hile kullanır, yani sadece set
her satırda kullanmak. Tırnak gibi şeyler kaçmak için vardır <
, >
, &
, |
. Ancak, girdide tırnak işaretleri kullanıldığında kendileri kırılır. Ayrıca, bu tür karakterlerle depolanan değişkenlerdeki verileri daha fazla işlerken her zaman dikkatli olmanız gerekir.
Genel olarak, toplu iş dosyalarında baş ağrısına veya soruna neden olmamak için rastgele girdilerden otomatik olarak kaçmak benim için oldukça imkansız görünüyor. En azından henüz bunu yapmanın bir yolunu bulamadım. Tabii ki, ilk çözümle bu sorumluluğu yapılandırma dosyasını yazan kişiye zorluyorsunuz.
Harici yapılandırma dosyası da geçerli bir toplu iş dosyasıysa, yalnızca şunları kullanabilirsiniz:
call externalconfig.bat
senaryonuzun içinde. Aşağıdaki a.bat dosyasını oluşturmayı deneyin:
@echo off
call b.bat
echo %MYVAR%
ve b.bat:
set MYVAR=test
A.bat dosyasını çalıştırmak çıktı oluşturmalıdır:
test
call
btw ile eşzamanlı olarak çağırmak ), "işlem kullanılmakta olduğu için dosyaya erişemiyor" der ve çağrılamaz.
Toplu iş, giriş ve çıkış boruları olarak köşeli parantezlerden küçük ve büyük olanları kullanır.
>file.ext
Yukarıdaki gibi yalnızca bir çıktı parantezi kullanmak o dosyadaki tüm bilgilerin üzerine yazacaktır.
>>file.ext
Sağdaki çift parantezin kullanılması bir sonraki satırı dosyaya ekleyecektir.
(
echo
echo
)<file.ext
Bu, dosyanın satırlarına dayalı olarak parametreleri çalıştıracaktır. Bu durumda, "echo" kullanılarak yazılacak iki satır kullanıyoruz. Sağ parantez dirseğine dokunan sol köşeli parantez, o dosyadaki bilgilerin bu satırlara aktarılacağı anlamına gelir.
Sadece örnek bir okuma / yazma dosyası derledim. Aşağıda, her bir parçanın ne yaptığını açıklamak için dosya bölümlere ayrılmıştır.
@echo off
echo TEST R/W
set SRU=0
SRU bu örnekteki herhangi bir şey olabilir. Aslında, Enter'a çok hızlı basarsanız çökmeyi önlemek için ayarlıyoruz.
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:
Şimdi değişkenleri bir dosyaya yazmamız gerekiyor.
(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause
"Command Database" için kısa bir form olarak .cdb kullanıyorum. Herhangi bir uzantıyı kullanabilirsiniz. Sonraki bölüm kodu sıfırdan test etmektir. Dosyanın başında çalıştırılan set değişkenlerini kullanmak istemiyoruz, aslında onların yazdığımız settings.cdb'den yüklenmesini istiyoruz.
:read
(
set /p input=
set /p input2=
)<settings.cdb
Bu yüzden, girdi ve girdi2 değişkenlerini ayarlamak için dosyanın başlangıcında yazdığınız ilk iki bilgi satırını (çalıştığından emin olmak için satırları ayarlamayı atlama seçeneğiniz vardır) boruladık.
echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit
:newecho
echo If you can see this, good job!
pause
exit
Bu, settings.cdb paranteze aktarılırken ayarlanan bilgileri görüntüler. Ekstra bir iyi iş motive edici olarak, enter tuşuna basarak ve daha önce "1" olarak belirlediğimiz varsayılan değerleri ayarlamak, iyi bir iş mesajı döndürür. Dirsek borularının kullanılması iki yönlüdür ve "FOR" maddesini ayarlamaktan çok daha kolaydır. :)
Yani bunu doğru yapmalısın ?:
@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
Çıktı:
$ RunCount = 1
$ RunCount = 2
$ RunCount = 3
Yukarıda özetlenen teknik, değişkenleri birden çok toplu iş dosyası arasında paylaşmak için de kullanılabilir.
Biraz eski konu ama birkaç gün önce aynı soruyu sormuştum ve başka bir fikir buldum (belki birisi yine de yararlı bulacaktır)
Örneğin, farklı konularla (aile, boyut, renk, hayvanlar) bir config.bat oluşturabilir ve bunları toplu komut dosyalarınızda istediğiniz herhangi bir yerde ayrı ayrı uygulayabilirsiniz:
@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
Bundan sonra, 'call config.bat all' ile tam olarak arayarak veya sadece bazı kısımlarını arayarak (aşağıdaki örneğe bakın) buradaki fikir, bazen her şeyi aramama seçeneğiniz olduğunda daha kullanışlı olmasıdır. bir Zamanlar. Bazı değişkenler belki henüz çağrılmak istemiyorsunuz, böylece onları daha sonra arayabilirsiniz.
Örnek 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
Umarım başkalarının cevaplarında bana yardım etme şekline yardımcı olur.
Yukarıdakilerin kısa bir versiyonu:
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
İyi günler.
Eski güzel parametreleri unutmayalım. * .Bat veya * .cmd dosyanızı başlatırken, komut dosyası adından sonra en fazla dokuz parametre ekleyebilirsiniz:
call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"
Myscript.bat şunun gibi bir şey olabilir:
@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:\>
Yöntemi excutable yapılandırmayla kullanmaya çalışırken, çağrının komut dosyasının nerede bulunduğuna bağlı olarak çalışabileceğini veya çalışmayabileceğini fark ettim:
call config.cmd
Bunun bir anlam ifade etmediğini biliyorum, ama benim için bu bir gerçek. Komut dosyasının en üstünde "call config.cmd" olduğunda, çalışır, ancak komut dosyasında daha ileride ise çalışmaz.
Çalışmıyor derken, değişkenin çağıran komut dosyası tarafından ayarlanmadığını kastediyorum.
Çok çok tuhaf !!!!