編集:不要で危険なcall echo %%x] !choice[%%x]!
コマンドをに置き換えましたecho %%x] !choice[%%x]!
。そもそもなぜそれを含めたのかさえわかりません。
ノート:
単独:
行は無視してください。何らかの理由で、コード内のすべての空白行が折りたたまれており、書式を維持するために空白行に何かを配置する必要がありました。ごめん。
@echo off
setlocal enabledelayedexpansion
set count=0
:
:: Read in files
for %%x in (*.sln) do (
set /a count=count+1
set choice[!count!]=%%x
)
:
echo.
echo Select one:
echo.
:
:: Print list of files
for /l %%x in (1,1,!count!) do (
echo %%x] !choice[%%x]!
)
echo.
:
:: Retrieve User input
set /p select=?
echo.
:
:: Print out selected filename
echo You chose !choice[%select%]!
編集:要求に応じてサブディレクトリを含めるように例を変更しました。
サブディレクトリにある sln ファイルに関するご要望にお応えするためfor %%x in (*.sln)
に、現在のディレクトリにある sln ファイルのみを返す を変更し、現在のディレクトリでコマンドfor /f %%x in ('dir /s /b *.sln')
を実行して結果を返すようにしました。dir /s /b *.sln
出力をできるだけきれいで明確にするために、ファイルを一覧表示するときに出力される内容を、パス全体!choice[%%x]!
から現在のディレクトリから始まる相対パスに変更しました (これにより、現在のパスとディレクトリ ( ) とバックスラッシュ ( )!choice[%%x]:%cd%\=!
が置き換えられます)なし)。%cd%
\
@echo off
setlocal enabledelayedexpansion
set count=0
:
:: Read in files
for /f %%x in ('dir /s /b *.sln') do (
set /a count=count+1
set choice[!count!]=%%x
)
:
echo.
echo Select one:
echo.
:
:: Print list of files
for /l %%x in (1,1,!count!) do (
echo %%x] !choice[%%x]:%cd%\=!
)
echo.
:
:: Retrieve User input
set /p select=?
echo.
:
:: Print out selected filename
echo You chose !choice[%select%]!
上記のコードは、現在のディレクトリからファイルへの相対パスのみを表示しますが、変数内のフル パスは残しますchoice[#]
。
パス全体をまったく処理したくない場合は、ループに1 行追加し、for /f %%x...
ループ内のエコー行をfor /l %%x ...
(編集された) 最初の例の行に戻すと、コードは次のようになります。 (変更がどこにあるかを説明するには、コード全体を表示するのと同じくらい時間がかかります):
@echo off
setlocal enabledelayedexpansion
set count=0
:
:: Read in files
for /f %%x in ('dir /s /b *.sln') do (
set /a count=count+1
set choice[!count!]=%%x
for %%y in (!count!) do set "choice[%%y]=!choice[%%y]:%cd%\=!"
)
:
echo.
echo Select one:
echo.
:
:: Print list of files
for /l %%x in (1,1,!count!) do (
echo %%x] !choice[%%x]!
)
echo.
:
:: Retrieve User input
set /p select=?
echo.
:
:: Print out selected filename
echo You chose !choice[%select%]!
そのステートメントの編集/復元は厳密には必要ではなく、出力をまったく変更しませんが、ファイル名が最初に読み取られたときに変数内の現在のディレクトリのパスが既に削除されecho
ているという事実を認識するだけなので、プログラミングの良い方法です。choice[#]
これを変更すると、不必要な複雑さがなくなり、コードが変更されたり、他の用途に適合した場合に予想外の結果が生じる可能性がなくなります。行をそのままにしておくと、変数内の現在のディレクトリのすべてのインスタンスを何も置き換えようとしますchoice[#]
。置換に失敗すると、文字列は変更されません。