2010-09-25 108 views
4

我試圖從起始行復制一個文件到另一個文件達到極限。即, 第1行到第10行(file1.txt) - > file2.txt 但寫入「!」被跳過。我能做些什麼來解決它。任何幫助將感恩。批處理文件編程

該函數的循環如下所示。

%NF%-> new file. 

%EF%-> existing file 

%1% -> line number(passed from another part) 

:_doit 

findstr /N /R "." %EF%|findstr /B /C:"%1:">nul 

if errorlevel 1 ( 
    echo. >>%NF%   
) else ( 
    for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do ( 
     if [%%a] EQU [] ( 
      echo. >>%NF%  
     ) else ( 
      echo %%a >>%NF%  
     )  
    ) 
) 

回答

2
if errorlevel 1 ( 
    echo. >>%NF% 
) else ( 
    for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do ( 
     if [%%a] EQU [] ( 
      echo. >>%NF% 
     ) else( 
      setlocal DisableDelayedExpansion 
      echo %%a >>%NF% 
      endlocal 
     ) 
    ) 
) 
+0

有兩個問題,「回聲」。是「echo」的兩倍,如果存在一個名爲「echo」的文件,它會失敗。第二個問題是長文件代碼不起作用,因爲你沒有使用endlocal,因此你會得到溢出。 – jeb 2011-01-28 07:14:26

1

也許使用gawk.exe從UnxUtils

gawk "NR<10" <file1> file2 
+1

更好的GNU GAWK:gnuwin32.sourceforge.net/packages/gawk.htm – ghostdog74 2010-09-28 09:50:05

3

如果你可以下載工具,你可以使用GNU win32 gawk

gawk.exe "NR>10{exit}1" file1 > file2 

而且你可以看看這個線程here那是類似的

+1

是否在Windows批處理文件的工作? – 1355 2010-09-28 09:54:33

+0

@Sarika:它的作品,而不是Windows批處理文件。 – abatishchev 2010-09-28 09:55:15

+0

是的,它只是一個命令。所以把這個命令放到你的批處理文件中。 – ghostdog74 2010-09-28 09:56:12

3

原因是延遲擴展,如果y ou禁用它,也!按預期工作。 您只能爲循環禁用它。

if errorlevel 1 ( 
    echo. >>%NF%   
) else (
    setlocal DisableDelayedExpansion 
    for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do ( 
     if [%%a] EQU [] ( 
      echo. >>%NF%  
     ) else ( 
      echo %%a >>%NF%  
     )  
    ) 
    endlocal 
) 

解析器用於批次線具有多個階段: 第一個階段的%變種%的膨脹,然後是特殊字符相「^ <> & |() 和%%的相位後,延遲(感嘆號階段)。

這就是爲什麼!dissappear你的情況。 因爲你得到了你的文件 像這樣%% A =你好! 驚歎號階段儘量擴大的原因!,但是這個失敗並且被移除。

如果在你的文件中是行 你好^! 你得到了你的「複製」 你好!

但是在批處理文件中,需要兩個插入符號來顯示一個!

echo hello^^! 

因爲在phase2中,^^!被誇大到^!,並且在驚歎號階段,最後一個脫字符號逃脫了!

+1

非常非常感謝您的寶貴回覆。我太晚了...... – 1355 2010-10-20 08:51:21

+0

但是我把DisableDelayedExpansion放到了另一個塊中,以便正常工作。謝謝。 – 1355 2010-10-20 09:01:27

+0

如果錯誤級別1( \t回波。>>%NF% )否則( \t FOR/F 「令牌= 1個delims =」 %%一個在('FINDSTR/N/R 「」 %EF%^| FINDSTR/B/C: 「%1:」「)做( \t \t如果[%%一個] EQU []( \t \t \t回聲。>>%NF% \t \t)否則( \t \t \t SETLOCAL DisableDelayedExpansion \t \t \t回波%%一個>>%NF% \t \t \t ENDLOCAL \t \t) \t) ) – 1355 2010-10-20 09:23:16