2010-09-25 3 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

1

Может использовать gawk.exe из UnxUtils:

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

Лучше GNU простак: gnuwin32.sourceforge.net/packages/gawk.htm – ghostdog74

3

Если вы можете загрузить инструменты, вы можете использовать GNU win32 gawk

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

И вы посмотрите на эту тему here может что аналогично

+1

ли работа в окна пакетного файла? – 1355

+0

@Sarika: Он работает вместо оконного пакетного файла. – abatishchev

+0

Да, это просто команда. Поэтому поставьте эту команду внутри своего командного файла. – ghostdog74

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 
) 

Анализатор для пакетных линий имеет несколько фаз: Первая фаза расширения% Var%, затем идет специальная фаза символ «^ <> & |() и после %% фазы, замедленный (фаза восклицание).

Вот причина, почему исчезнут! в вашем случае. Потому что вы получили что-то вроде этого из файла %% а = Hello! Тогда фаза восклицательный попытаться расширить!, но это не удается и оно удалено.

Если в вашем файле находится строка Hello ^! вы получили в своей «копии» Здравствуйте!

Но в пакетном файле вам нужно два шаблона для отображения одного!

echo hello^^! 

Потому что в фазе2, ^^! раздувается до ^!, а в восклицательной фазе последний карет убегает!

+1

очень спасибо за ваш ценный ответ. Я так опаздываю. – 1355

+0

Но я поместил DisableDelayedExpansion в следующий блок для правильной работы. Спасибо. – 1355

+0

, если код ошибки 1 ( \t эхо-сигнала. >>% NF% ) остальное ( \t для/ф "токенов = 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 эхо %% A >>% NF% \t \t \t Endlocal \t \t) \t) ) – 1355

Смежные вопросы