7

'dir'コマンドの出力をBATファイルの配列に読み込む方法はありますか?または、最初にファイルに出力してから、ファイルを読み取り、後でファイルを削除する必要がありますか?

目的は、ディレクトリ内のフォルダのリストを取得し、それぞれに番号を追加してから、フォルダを選択するための数値入力をユーザーに求めることです。

更新:わかりました!

SETLOCAL EnableDelayedExpansion
SET /A c=1

FOR /F "tokens=*" %%F in ('dir /on /b /a:d /p %svnLOCAL%') DO ( 
    ECHO !c!. %%F
    SET dir_!c!=%%F
    SET /a c=c+1    
)

REM test array
ECHO !dir_4!
ENDLOCAL
4

2 に答える 2

13

バッチは正式には配列をサポートしていませんが、環境変数を使用して配列をエミュレートできます。

@echo off
setlocal enableDelayedExpansion

::build "array" of folders
set folderCnt=0
for /f "eol=: delims=" %%F in ('dir /b /ad *') do (
  set /a folderCnt+=1
  set "folder!folderCnt!=%%F"
)

::print menu
for /l %%N in (1 1 %folderCnt%) do echo %%N - !folder%%N!
echo(

:get selection
set selection=
set /p "selection=Enter a folder number: "
echo you picked %selection% - !folder%selection%!

上記のコードでは、「配列」要素の名前はfolder1、folder2、folder3...です。

代わりに、folder [1]、folder [2]、folder[3]...などの名前を使用する人もいます。それは確かにより多くの配列のように見えます、しかしそれはまさに私がそれをしない理由です。バッチについてあまり知らない人は、そのような変数を見て、バッチが配列を適切にサポートしていると想定します。

上記の解決策は、フォルダ名のいずれかに文字が含まれている場合は正しく機能しません!。拡張が遅れるため、%%F変数の拡張中にフォルダ名が破損します。遅延拡張のオンとオフを切り替えることを含む回避策がありますが、必要でない限り、取り組む価値はありません。

于 2012-05-11T03:28:35.887 に答える
9

これは答えではありませんが、dbenhamの答えへの返信としての大きなコメントです。

この問題についての私の見解は、dbenhamsの見解とは正反対です。私の意見では、バッチトピックへの回答では、特に初心者の場合は非常に簡潔で明確であり、問​​題の解決に役立つ最小限の情報を提供する必要がありますが、回答を圧倒して混乱させないようにする必要があります。バッチで配列をシミュレートする方法は2つあります。下付き文字を囲むために広く使用されている角かっこを使用するかどうかですが、どちらの場合も概念は同じです。数値インデックスを使用して同じ名前の変数のリストから特定の要素を選択します。 。

角かっこを使用しないと、初心者はコアコンセプトを理解できません。代わりに、バッチファイルが問題を解決するために「奇妙なトリック」を使用したと考えるかもしれません。一方、経験豊富なプログラマーは、確かに「これは配列ですが、別の方法で記述されています」と言うでしょう。この機能を他の別のものと間違える方法はなく、他の別のものに偽装する理由もありません。

角括弧を使用すると、初心者は「配列」の概念に関する大量の情報と、このトピックに関する多くの例を多くのプログラミング言語で見つけることができます。もちろん、バッチファイルですぐに使用できるプログラミング言語に依存しない説明もあります。 。この場合の角括弧の使用は、そうしないことよりもはるかに明確です。ただし、一部の人々は、これらの利点は、バッチが「正式にアレイをサポートしている」と仮定するという「混乱」に値しないと考えています。

私の意見では、この問題の中心は、バッチが正式に配列をサポートしているかどうかを議論することではなく、誰でも配列の概念を使用してバッチファイルのデータを操作できるという事実です。バッチがアレイを適切にサポートしていると考える人、特に初心者の可能性については、まったく問題はありません。配列管理はプログラミング言語によって異なるため、バッチの詳細の説明が必要になります。しかし、この主題についてのより正式な議論が重要であると思われる場合は、別の例を述べたいと思います。

Cプログラミング言語が入出力操作を「正式にサポート」していないことをご存知ですか?デニス・リッチーがそれを考案したとき、彼はコンパイラーを小さくコンパクトに保つ​​ために、これらの操作を言語設計の外に特別に残しました。これは、Cプログラムでデータの読み取り/書き込みができないことを意味しますか?もちろん違います!これは、これらの操作が関数ライブラリを介してコンパイラの外部で実装されることを意味します。したがって、Cコンパイラを開発する必要がある場合、PRINT、READ、またはその他のI / Oステートメントは存在しないため、コンパイル方法について心配する必要はありません。 C言語で!

おもしろいですね。

したがって、初心者が「C言語でメッセージを書く方法は?」と尋ねる場合、正しい答えは次のようになると思いますか。「できません。C言語は正式にはI / Oステートメントをサポートしていませんが、できます。ライブラリ関数を介してそのような操作をエミュレートしますか?」もちろん違います!ほとんどの人はprintfの説明に答えるだけですが、実際にはprintf()がC言語の一部ではないとは誰も言及しておらず、これは正しいと思います。最終的な分析では、C言語がI / O操作をサポートしていると誰かが考える場合の問題は何ですか?実装方法に関係なく、CプログラムでI/O操作を使用できます。

さて、私の謙虚な意見では、バッチの配列の場合にも同じアプローチを使用する必要があります。

おそらくもっと近い例はこれです:「バッチでの算術演算」について多くの質問があり、答えは通常「set /Aコマンドを使用する」です。「バッチファイルは数値変数をサポートせず、文字列のみをサポートしますが、算術演算はset /Aコマンドなどのいくつかの方法でエミュレートできます」という答えは見たことがありません。なんで?バッチの配列について意見を述べるとき、純粋主義者は「より純粋主義者」であるように見えますが、数値などの他のトピックについては気にしません。「バッチは配列をサポートしていない」という頻繁な説明の目的がよくわかりません。

ユーザーrojoはこの点について意見を述べました:

これは、質問者が解決しようとしている問題の解決策を提供しない衒学的な議論です。

(この回答の上にある彼の完全なコメントを参照してください)。

于 2012-05-13T07:18:18.000 に答える