2010-09-25 9 views
4

J'ai essayé de copier un fichier à un autre à partir de la ligne de départ jusqu'à une limite. c'est-à-dire, ligne 1 à 10 (fichier1.txt) -> fichier2.txt mais en écrivant "!" est sauté. que puis-je faire pour le résoudre. Toute aide sera reconnaissante.Programmation de fichier par lots

La boucle pour cette fonction est donnée ci-dessous.

%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%  
     )  
    ) 
) 

Répondre

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

Il y a deux problèmes, "echo". est deux fois plus lent que "echo (" et il échoue si un fichier nommé "echo" existe.Le deuxième problème est avec les fichiers longs votre code ne fonctionne pas, parce que vous n'avez pas utilisé endlocal et donc vous obtenez un débordement. – jeb

1

Peut-être utiliser gawk.exe de UnxUtils:

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

Mieux GNU gawk: gnuwin32.sourceforge.net/packages/gawk.htm – ghostdog74

3

Si vous pouvez télécharger des outils, vous pouvez utiliser GNU win32 gawk

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

Et vous pouvez jeter un oeil à ce fil here que est similaire

+1

fonctionne-t-il dans les fenêtres fichier batch? – 1355

+0

@Sarika: Il fonctionne à la place le fichier de commandes Windows. – abatishchev

+0

oui, c'est juste une commande. Alors mettez cette commande dans votre fichier batch. – ghostdog74

3

La raison en est l'expansion retardée, si y ou le désactiver, aussi le! fonctionne comme prévu. Vous pouvez le désactiver uniquement pour la boucle.

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 
) 

L'analyseur pour les lignes de traitement par lots a plusieurs phases: La première phase est le% var% l'expansion, puis vient la phase de caractère spécial «^<> & |() et après la %% une phase, le retard (phase d'exclamation).

C'est la raison pour laquelle le disparaitra! dans votre cas. Parce que vous avez quelque chose comme ça de votre fichier %% a = Bonjour! Puis la phase d'exclamation essayer d'élargir le!, mais cela échoue et il est retiré. Si votre fichier contient la ligne Bonjour ^! vous avez dans votre "copie" Bonjour! Mais dans un fichier batch, vous avez besoin de deux carets pour en afficher un!

echo hello^^! 

Parce qu'en phase2, le ^^! est gonflé à^!, et dans la phase d'exclamation, le dernier signe s'échappe!

+1

très très merci pour votre précieuse réponse. Je suis si en retard .. – 1355

+0

Mais j'ai placé le DisableDelayedExpansion dans le prochain bloc pour fonctionner correctement. Merci. – 1355

+0

si errorlevel 1 ( \t écho. >>% NF% ) else ( \t pour/f "jetons = 1 delims =" %% a in ('findstr/N/R "" % EF%^| findstr/B/C: "% 1:" ') faire ( \t \t si [%% a] EQU [] (écho \t \t \t.>>% NF% \t \t) autre ( \t \t \t setlocal DisableDelayedExpansion \t \t \t écho %% une >>% NF% \t \t \t endlocal \t \t) \t) ) – 1355

Questions connexes