2

ディレクトリ内のすべての *.pem ファイルを表示するバッチ ファイルがあり、ユーザーに 1 つを選択するオプションを提供します。現時点では、ECHO に選択した番号を使用して選択したファイルをユーザーに表示しようとしています。配列の内容。インデックス変数 "selectedPem" は、IF ステートメント内にあるため、% を使用しており、遅延展開を使用していないため、配列のインデックス ブラケットで展開されていません。これは、配列のインデックスでは機能しないようです。ブラケット。これは、IFステートメントの前に「selectedPem」変数を設定すると、正しくECHOされるためだと思います。これが機能するための唯一のオプションは、何らかの形でサブルーチンを利用することだと思います。selectedPem 変数が IF ステートメント内で機能しないのはなぜですか?

@echo off
setlocal enabledelayedexpansion 
set dir=%~dp0
cd %dir%

ECHO Performing initial search of private and public keys...
set pemI=0
set keyI=0
for %%p in (*.pem) do (
    REM echo %%~nxp
    set pems[%pemI%]=%%~nxp
    REM echo !pems[%pemI%]!
    set /a pemI=%pemI%+1
)
REM echo %pems[0]%
set /a totalPems=%pemI%-1
REM This is the test selectedPem variable that showed me the variable works 
REM if I set it outside 
REM of the "if defined pems[0]" statement
REM set selectedPem=
if defined pems[0] (
    echo PEM Files Found:
    for /l %%p in (0,1,%totalPems%) do (
        echo %%p^) !pems[%%p]!
    )
    ECHO Select a pem file to be used as your private key. Otherwise, press 
    Q to not select one.
    set /P selectedPem=Enter a number or Q:
    IF "!selectedPem!"=="q" (
        ECHO Skipping private key selection.
    ) ELSE (
        ECHO !selectedPem!
        ECHO %pems[0]%
        REM The below ECHO only works when the above selectedPem is set 
        REM outside of the "IF defined" statement
        ECHO !pems[%selectedPem%]!

        REM Tried these other implementations:
        REM ECHO !pems[!!selectedPem!!]!
        REM ECHO %pems[!selectedPem!]%
        REM setlocal disabledelayedexpansion
        REM ECHO %pems[%%selectedPem%%]%

        set privatekey=!pems[%selectedPem%]!
        ECHO You chose %privatekey%
    )   
)`

出力:

Performing initial search of private and public keys...
PEM Files Found:
0) brandon.pem
Select a pem file to be used as your private key. Otherwise, press Q to not 
select one.
Enter a number or Q:0
0
brandon.pem
ECHO is off.
You chose

「ECHOがオフになっている」ということは理解しています。配列変数参照を空として解釈しているため、代わりに出力されます。私のスクリプトを読んでくれてありがとう。

4

2 に答える 2