0

これを理解しようとしてクラスで退屈。

Windows コマンド プロンプトの場合:

ipconfig /allすべてのループバック、トンネルなどを返します。

実行ipconfig /all | find /n "Internal"すると、[11]Ethernet Adapter Internal が返されます。私がやりたいことは、先頭から 11 をサブストリング化し、これを別の何かにパイプして、11 ~ 19 行目などを返すことができるようにすることです。jquery やチェーンと同様に、これを 1 行で実行できますか?

4

1 に答える 1

0

FOR/Fループを使用して11を解析するのは簡単です。しかし、その値を利用することは、コマンドラインからの1つのライナーでは困難です。

これが、コマンドラインから1つのライナーを実行するために私が思いつくことができる最高のものです。

set "stop="&for /f "delims=[]" %N in ('ipconfig /all^|find /n "Internal"') do @for /f "tokens=1* delims=:" %A in ('ipconfig /all^|findstr /n "^"') do @if %A geq %N if not defined stop echo(%B&>nul 2>nul set /a 1/(%A-%N-8)||set stop=1

私が考えることができる最短のワンライナーは、異なる戦略を使用しています。

set n=&for /f "delims=" %A in ('ipconfig/all') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo %A) else echo %A|find "Internal"&&set n=8

ただし、上記のソリューションは空白行を無視します。

空白行を保持したい場合は、次のように機能します。

set n=&for /f "tokens=1* delims=:" %A in ('ipconfig/all^|findstr/n "^"') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo(%B) else echo %B|find "Internal"&&set n=8

編集

2番目と3番目のソリューションのロジックを少し短くして単純化しました。

2番目のオプションについて説明します。

最初に明示的にカウンターの定義を解除し、次にFORを使用してIPCONFIG/ALLコマンドの出力を読み取ります。ここで、DO句内の楽しい部分を開始します。

最初はカウンターが定義されていないため、ELSE句が実行されます。現在の行をFINDにパイプして、「内部」を探します。文字列が見つからない場合は何も起こらず、次の行に進みます。ただし、見つかった場合は、その行が印刷されます。&&次に、文字列が見つかったため、後のコードが実行されます。次の8行を印刷するため、カウンターを8に設定しました。

カウンターは残りの行に対して定義されているため、IFステートメントの最初の部分に切り替えます。SET/Aを使用して計算を行います。まず、1をカウンターの現在の値で割ります。カウンターが0の場合、エラーが発生し、ステートメントの残りの部分は無視されます。カウンターが0でない場合は、次にカウンターを1デクリメントします。SET/ Aコマンドからのメッセージを表示したくないため、stdoutとstderrの両方をnulにリダイレクトします。SETコマンドが成功した場合は、その行をエコーし​​ます。文字列が見つかったときに最初にカウンターを8に設定したので、カウンターが0に達するまでに最大8行が印刷されます。

于 2012-08-13T17:51:21.820 に答える