2014-11-10 2 views
0

확장 기능 장애로 여전히 고통 받고 있습니다. 로그 파일의 시작 부분에서 GTR 100 줄을 지우려고합니다. 다음과 같이 작동해야하는 것처럼 보이지만 표시된 것처럼 for/f "건너 뛰기"가 거의 작동하지 않습니다. 누군가 여기서 친절하게 무엇이 잘못되었는지 설명 할 수 있습니까? 고맙습니다!/f를 사용하여 텍스트 파일의 시작 부분에서 줄을 건너 뛰는 방법

@echo off 
SETLOCAL EnableDelayedExpansion 

Set "logfile=abc.log" 

rem ~ Get line count and exit if not greater 100 
    For /f %%G in ('Type "!logfile!"^|Find "" /v /c') Do SET /a linecount=%%G 
    If not %linecount% GTR 100 exit /b 

rem ~ get number lines to skip 
    set /a skiplines=!linecount! -100 
    echo. &echo logfile=%logfile%, linecount=%linecount%, skiplines=%skiplines% 
    :: Above displays: logfile=abc.log, linecount=243, skiplines=143 

: 여기가 문제 야 :

rem ~ skip the first %skiplines% in file and write remaining to temp 
    for /f "skip=!skiplines! delims=*" %%H in ("!logfile!") do echo %%H >>newfile.tmp 

:: 위 오류를 줄 : "! skiplines을 delims을 = *".이 시간에 예상치 못한 "

for /f "skip=%skiplines% delims=*" %%H in ("!logfile!") do echo %%H >>newfile.tmp 

:: (예상보다 위에 newfile.tmp에 0을 씁니다)

하나의 솔루션 - - - - - - - - - - - - - - - - -

이 한 줄짜리 해결책을 승인 된 것과 함께 눈에 띄게 표시하고 있습니다. 대답. @Magoo 응답에 포함 된 코드에는 usebackq이 필요합니다. 이 작품 :

for /f "usebackqskip=%skiplines% delims=*" %%H in ("!logfile!") do echo %%H>>newfile.tmp 
+0

원본 코드가 잘못된 파일 var를 보여주었습니다 (이전 코드를 올리는 중 오류가 발생했습니다.).! skiplines! Magoo와 ths가 지적한 것처럼 오류를 제기하고있었습니다. 그러나 * 수정 된 파일 var (logfile)을 사용하고 % skiplines %를 사용하더라도 For/f "skip"은 tmp 파일에 쓰지 않습니다. * – sjoy

+0

게시물의 끝 부분에있는 솔루션으로 코드가 작동하고 제목에 대한 질문에 답합니다. @ 마구 (Magoo)의 대답은 "누군가 여기서 잘못된 점을 설명 할 수 있습니까?"라고 대답했습니다. – sjoy

답변

1

그것은 !var!%var%이 과정에서 평가 될 때의 문제입니다. %var%이 먼저 평가 (대체)되지만 !var!은 이후에 으로 평가되므로 루프의 조건이 설정되므로 해당 위치에 !var!이 필요하지 않습니다.

솔루션은 (루프 내에서) 값이 런타임에 해석 시간이 아닌 것으로 결정되는 경우에만 !var!을 사용하는 것입니다. 구문 분석 값에 액세스하려면 %var%을 사용하십시오. !var!%var%을 루프 외부에서 동등한 것으로 취급하지 마십시오. 명령을 받으면 그들은 효과적으로 존재하지만 전부는 아닙니다.

은 BTW - linecount은 100 SKIP 내가 당신이라면 나는 GEQGTR을 변경할 것 0 좋아하지 않는 exacly 때 무슨 일이


이 무엇을 설명한다 일상의 ... 어떻게 시계 사고. 그것은 내 작업 영역을 사용합니다. 시스템에 맞게 변경해야합니다. 파일이 !countfile!!logfile!에 있지 않기 때문에

@ECHO OFF 
SETLOCAL 
:: Just setting up data 
SET "sourcedir=U:\sourcedir" 
Set "logfile=abc.log" 

PUSHD "%sourcedir%" 
(
FOR /l %%a iN (1,1,99) DO ECHO line %%a 
)>"%logfile%" 

CALL :process 
>>"%logfile%" ECHO line 100 
CALL :process 
>>"%logfile%" ECHO line 101 
CALL :process 
>>"%logfile%" ECHO line 102 
CALL :process 

popd 
GOTO :eof 

:process 

For /f %%G in ('type "%sourcedir%\%logfile%"^|Find "" /v /c') Do SET /a linecount=%%G 

ECHO %linecount% lines IN log file 

IF %linecount% leq 100 EXIT /b 

ECHO MORE than 100 lines!! 

SET /a skiplines=linecount - 100 
SET /a skiplines2=%linecount% - 100 
ECHO ------- observe response from this instruction 
SET /a skiplines3=!linecount! - 100 
ECHO ------- this is because of the sequence-of-evaluation-and-substitution 

SET skipline 

:: delete the output file 
DEL newfile.tmp >NUL 2>NUL 

FOR /f "usebackqskip=%skiplines% delims=*" %%H IN ("%sourcedir%\%logfile%") DO ECHO %%H >>newfile.tmp 
ECHO ===================== 
ECHO after skipping %skiplines% of %logfile% result is 
TYPE newfile.tmp 
ECHO ===================== 
EXIT /b 

결과는 아마

99 lines IN log file 
100 lines IN log file 
101 lines IN log file 
MORE than 100 lines!! 
------- observe response from this instruction 
Missing operator. 
------- this is because of the sequence-of-evaluation-and-substitution 
skiplines=1 
skiplines2=1 
skiplines3=0 
===================== 
after skipping 1 of abc.log result is 
line 2 
line 3 
... 
line 100 
line 101 
===================== 
102 lines IN log file 
MORE than 100 lines!! 
------- observe response from this instruction 
Missing operator. 
------- this is because of the sequence-of-evaluation-and-substitution 
skiplines=2 
skiplines2=2 
skiplines3=0 
===================== 
after skipping 2 of abc.log result is 
line 3 
line 4 
... 
line 101 
line 102 
===================== 
+0

감사합니다. @Magoo. 사용법에 대한 귀하의 의견을 이해하십시오. (필자는 여러 개의 파일을 만들고 싶었지만 문제를 추적하는 데 너무 많은 어려움을 겪고있었습니다.) *하지만 문제는 남아 있습니다 ... 변수가 작동하지 않습니다. * for % skiplines %는 값 0을 얻고 있습니다. 대답에 뭔가 빠졌습니까? 다른 방법이 있습니다. 어쩌면 내가 건너 뛸거야? :) – sjoy

+0

고마워. 나는 이것의 수정이 효과가있을 것이라고 확신한다. 내일 좀 더 자세히 공부하고 더 나은 이해를 얻은 후에 내일 당신을 투표 할 것입니다. – sjoy

1

해야한다. % skiplines %는 설정과 동일한 명령문에서 사용되지 않으므로 작동해야합니다.

+0

잘못된 파일 var을 가져 주셔서 감사합니다. 나는 고쳤다. 의견보기. – sjoy

관련 문제