2016-03-30 30 views
1

Bunun neden işe yaramayacağı konusunda herhangi bir fikrin var mı? Altprogramda %A%'u %%f ile değiştirmeyi denedim, ancak yine de işe yaramaz.Döngüs için toplu iş akışı

FINDSTR: call cannot be opend. 
    FINDSTR: :subroutine cannot be opend. 
    test.bat:findstr windowsisajoke %A% 
    FINDSTR: pause cannot be opend. 

bu kod ile sorun nedir söyle, ben :) şu anda 3 gün gibi bunu almaya çalışıyorum:

SETLOCAL EnableDelayedExpansion 
    for %%f in (*.bat) do (set A=%%f call :subroutine %%f) 

    :subroutine 
    findstr windowsisajoke %A% 
    if %errorlevel%==0 
    goto end 
    copy %0 %A% 
    :end 

çıktı böyle bir şey gösterdi.

Her zaman olduğu gibi, herhangi bir yardım takdir edilir! Teşekkürler !

Bu,% 1 dosyası için kabul edilmiş gibi görünüyor. Program% errorlevel%: 0 == 0 değerini ayarlar ve kopyalama yapmadan çıkar. Program sadece ErrorLevel onay Yardım !: Her

for %%f in (*.bat) do (
     findstr windowsisajoke %1 
     if not %errorlevel%==0 
     copy "%0" "%1" 
    ) 
+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

cevap

2

Ö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 
+0

* bu üç gün düşündükten ve bu cevabı okuduktan sonra belki de Bir altprogramdan bir bloğa kod dönüştürürken hangi hatayı yaptığımı anlamaya çalışmak. – Joey

+0

Çok teşekkür ederim. Son kod şimdi çalışıyor gibi görünüyor! En sonunda! Yardımlarınız için tekrar teşekkürler, gerçekten takdir ediyorum çünkü programlama için oldukça yeniyim. Bu biraz zaman aldı, ama sonuç inanılmaz. Teşekkürler :) –