0

名前にワイルドカードを使用してファイルを連結するために、2 つの FOR ループを作成しています。More +1 コマンド (最初の行をスキップするため)、 > 記号を使用して一時ファイルをフィード
し、最後に /y 最終ファイルを新しい拡張ファイルに移動します (実際にはファイルの名前を変更します)。

最初のループで各ファイルを操作するためにスペースバーを押す必要があるのに、複数のファイルの2番目のループでは押す必要がない理由がわかりません!!!

バッチ ファイルの 1 行目に @ECHO OFF を追加しました。

奇妙な動作: 各コマンドを実行するために、最初のループに ECHO メッセージを書きました。削除すると (またはこの ECHO メッセージをコメントとして追加すると)、ループは機能しません。

その誤動作に対する提案はありますか?

ありがとうございました。

コードサンプル:

for %%x in (.\req*.csv) do (
  echo %%x ... 
  more +1 "%%x" >tmpStock
  move /y tmpStock "%%x".sse)

for %%F in (req*.csv.sse) do (type "%%F" >>Stock.txt)
for %%F in (req*.csv.sse) do (DEL /Q "%%F")
4

2 に答える 2

1

これが解決策だったと思います。

type req*.csv>tempfile
findstr /v /i /c:"unwanted text" tempfile>Stock.txt
del tempfile

*肩をすくめる*

于 2013-03-06T14:38:00.393 に答える
1

通常、MORE コマンドは、全画面に相当する情報を表示するたびに一時停止します。ただし、出力がリダイレクトまたはパイプされた場合、各画面の後で一時停止しません。残念ながら、ファイルの終わりまで無限に印刷し続けるわけではありません。出力がリダイレクトまたはパイプされた場合、~64k 行 (~65535) 後に一時停止します。

FOR /F ループを使用して最初の行以外をすべて処理することもできますが、これは比較的低速です。

ファイルからn行をスキップするために使用できる SKIP.BAT という単純なハイブリッド JScript/Batch ユーティリティを作成しました。これはフィルターとして機能し、純粋なバッチ FOR ループよりもはるかに高速です。データをパイプするだけで、指定した行数をスキップします。スクリプトは確実に改善できます。たとえば、エラー チェックはありません。

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Batch portion ***********
@echo off
cscript //E:JScript //nologo "%~f0" %*
exit /b 0

************* JScript portion **********/
for (var i=0; i<WScript.Arguments.Item(0); i++) {
  if (!WScript.StdIn.AtEndOfStream) WScript.StdIn.ReadLine();
}
while (!WScript.StdIn.AtEndOfStream) {
  WScript.Stdout.WriteLine(WScript.StdIn.ReadLine());
}

上記のスクリプトが現在のディレクトリ、または PATH にある限り、コードは次のように縮小できます。

@echo off
>Stock.txt (for %%F in (req*.csv) do type "%%F" | skip 1)

または、コマンドラインから:

>Stock.txt (for %F in (req*.csv) do @type "%F" | skip 1)

もちろん、ソリューション全体は純粋な JScript または VBScript で非常に簡単に記述できます。または、CSV 連結を 1 つのハイブリッド スクリプトに統合することもできます。ただし、スタンドアロンの SKIP ユーティリティを使用すると、バッチ開発に役立ちます。

于 2013-03-06T16:05:48.853 に答える