1

ユーザーが行番号を入力できるバッチ スクリプトを作成すると、スクリプトはテキスト ファイルのその行を削除します。

例: tmp.txt

1. aaa
2. bbb
3. ccc
4. ddd

スクリプトとユーザー入力 3 を実行すると、tmp.txt が

1. aaa
2. bbb
4. ddd

私はこのようなことを試みています:

@ECHO OFF

SET /P LINENUMBER=Enter the Line No:

FOR /F "tokens=1* delims=[]" %%a IN ('FIND /n /v "" ^< tmp.txt') DO (   
    IF %%a equ %LINENUMBER% (
                  ????????????????????
    )
)
4

2 に答える 2

1

これを試してください:

@echo off & setlocal 
set "InFile=Z:\Text.txt" 
set "OutFile=Z:\Erg.txt" 
set /p LineToDelete=

if exist "%OutFile%" del "%OutFile%" 
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%"
于 2016-05-15T17:15:33.283 に答える
1

ファイルを直接変更することはできません。目的のコンテンツで新しいファイルを作成し、元のファイルを新しいファイルに置き換える必要があります。

出力をリダイレクトし、目的のコンテンツを ECHO することによって、新しいファイルを作成します。ECHO(%%b行が空白だったために %%b が空の場合に使用します。b が空の場合ECHO %%bに生成されます。ECHO is off.ほとんどの人は を使用しますECHO.が、難解な状況では失敗する可能性があります。ECHO(失敗することはありません。

MOVE を使用して、元のファイルを新しいファイルに置き換えます。

FINDSTR を FIND の後に使用して不要な行を除外することにより、FOR /F ループ内で番号を確認する必要がなくなります。

これまでに記述したコードでは、各行から先頭[と文字が削除されることに注意してください。]行フィルターは FOR 反復の前に適用されるため、DELIMS を]only に設定することで状況をわずかに改善できます。

@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "tokens=1* delims=]" %%a IN (
    'FIND /n /v "" ^<tmp.txt^|FINDSTR /VLB "[%LINENUMBER%]"'
  ) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt

元の行のいずれかがすでに で始まっている]場合は、FIND の代わりに FINDSTR を使用して行番号を導入できます。nn:の代わりに format を使用します[nn]。この解決策は、あなたの行から先頭を取り除き:ます。

@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "tokens=1* delims=:" %%a IN (
    'FINDSTR /n "^" tmp.txt^|FINDSTR /VLB "%LINENUMBER%:"'
  ) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt

:テキスト ファイルにとの両方で始まる行が含まれている場合、]FOR /F を使用して行番号を解析することはできません。代わりに、検索と置換を使用します。ファイルに存在する可能性のあるものを保護するために、ループ内で遅延展開のオンとオフが切り替えられ!ます。

@ECHO OFF
setlocal disableDelayedExpansion
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "delims=" %%a IN (
    'FINDSTR /n "^" tmp.txt ^| FINDSTR /VLB "%LINENUMBER%:"'
  ) DO (
    set "ln=%%a"
    setlocal enableDelayedExpansion
    echo(!ln:*:=!
    endlocal
  )
)
>nul MOVE /y tmp.txt.new tmp.txt
于 2012-10-04T23:12:21.107 に答える