it-swarm-ja.com

バッチを使用して単一のテキストファイルを行ごとに複数のテキストファイルに分割する方法は?

私は次のプログラムを実行しています、

@echo off
cls
set /p "filename=type file name>"
setlocal enabledelayedexpansion
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
echo %%~dpnxa >>path.txt
)

出力ファイルがありますpath.txt を含む、

E:\new.txt 
E:\Redmi\new folder\new.txt
E:\windows\new folder\new folder\new.txt

私はそれらを次のような別々のファイルに入れるのが好きです。

E:\new.txt in path1.txt

E:\Redmi\new folder\new.txt in path2.txt

E:\windows\new folder\new folder\new.txt in path3.txt

1
Philip

単一のテキストファイルを行ごとに複数のテキストファイルに分割するにはどうすればよいですか?

Seth によるコメントに基づいて、次のバッチファイルを使用できます。

@echo off
cls
setlocal enabledelayedexpansion
set /p "filename=type file name>"
rem initialise counter to 1
set _count=1
for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" (
  echo %%~dpnxa >>path!_count!.txt
  rem increment the counter
  set /a _count+=1
  )
endlocal

ノート:

  • 変数setlocalが呼び出し元のfilenameシェルにリークするのを防ぐために、cmd行を移動しました。

参考文献

  • Windows CMDコマンドラインのA-Zインデックス
  • Windows CMDコマンドの分類リスト
  • enabledelayedexpansion -遅延拡張により、変数は解析時ではなく実行時に拡張されます。
  • endlocal -バッチファイルで環境変更のローカリゼーションを終了します。あるバッチファイルから別のバッチファイルに変数を渡します。
  • for/r -ファイルをループします(Recurseサブフォルダー)。
  • set --CMD環境変数を表示、設定、または削除します。 SETで行われた変更は、現在のCMDセッションの間のみ保持されます。
  • setlocal -バッチファイル内の環境変数の可視性を制御するオプションを設定します。
1
DavidPostill

私はあなたのためにはるかに簡単でおそらくより速い解決策を持っています:

  • パスリストを取得するには、DIR /S /B /A-Dの代わりにFOR /Rを使用します。これにより、IFステートメントが不要になります。
  • 行の先頭に一致するFINDSTR /Nにパイプして、出力ファイル名で使用する行番号を取得します。
  • FOR /F内ですべてを実行して、結果を反復し、各行の行番号とパスに解析します。
@echo off
setlocal
set /p "filename=type file name>"
for /f "delims=: tokens=1*" %%A in (
  'dir /s /b /a-d "E:\%filename%" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B

それが私のスクリプトである場合、プロンプトではなく、引数としてターゲットファイル名を渡します。

@echo off
for /f "delims=: tokens=1*" %%A in (
  'dir /s /b /a-d "E:\%~1" ^| findstr /n "^"'
) do >"path%%A.txt" echo %%B
2
dbenham