0

ファイル名のリストを含む変数があり、拡張子に基づいて、別のアクションを実行する必要があります。ループ内の拡張子を抽出できません

set BINARIES=file1.dll fil2.dll fil3.sys

:: for each file in list of binaries do
FOR %%G IN (%BINARIES%) DO (
    :: if extension is dll
    if /i [%%G:~-4%]==[.dll] (
        echo dll file
        ) else (
            echo sys file
        )
)

条件が常に失敗している場合。拡張子を正しく抽出する方法。

4

3 に答える 3

2
if /i "%%~xG"==".dll"

コマンド シェル ウィンドウのヘルプからfor /?:

さらに、FOR 変数参照の置換が拡張されました。
次のオプションの構文を使用できるようになりました。

    %~I - %I を展開し、周囲の引用符 (") を削除します
    %~fI - %I を完全修飾パス名に展開します
    %~dI - %I をドライブ文字のみに展開します
    %~pI - %I をパスのみに展開します
    %~nI - %I をファイル名のみに展開します
    %~xI - %I をファイル拡張子のみに展開します
    %~sI - 展開されたパスには短い名前のみが含まれます
    %~aI - %I をファイルのファイル属性に展開します
    %~tI - %I をファイルの日付/時刻に展開します
    %~zI - %I をファイルのサイズに展開します
    %~$PATH:I - PATH にリストされているディレクトリを検索します
                   環境変数を展開し、%I を
                   最初に見つかったものの完全修飾名。
                   環境変数名が異なる場合
                   定義されているか、ファイルが見つからない
                   検索すると、この修飾子は
                   空の文字列

修飾子を組み合わせて、複合結果を得ることができます。

    %~dpI - %I をドライブ文字とパスのみに展開します
    %~nxI - %I をファイル名と拡張子のみに展開します
    %~fsI - %I を短縮名のみのフルパス名に展開します
    %~dp$PATH:I - PATH にリストされているディレクトリを検索します
                   %I の環境変数であり、
                   最初に見つかったもののドライブ文字とパス。
    %~ftzaI - %I を出力行のような DIR に展開します
于 2013-08-24T03:12:52.910 に答える
0
set BINARIES=file1.dll fil2.dll fil3.sys

FOR %%G IN (%BINARIES%) DO echo %%G has a %%~xG extension.
于 2013-08-24T05:14:02.707 に答える
0

これを使用できるかどうかわかりません: %%G:~-4%

また、変数の遅延展開を使用する必要があります。キーは「!」を使用しています 一部の場所では「%」の代わりに。「set /?」で確認すると、(紛らわしい) 例が表示されます。

その背後にある理論はあまり覚えていませんが、これは私にとってはうまくいきました:

setlocal enabledelayedexpansion

set BINARIES=file1.dll fil2.dll fil3.sys

:: for each file in list of binaries do
FOR %%G IN (%BINARIES%) DO (
    :: if extension is dll
    set x=%%g
    set y=!x:~-4!
    if /i [%y%]==[.dll] (
        echo dll file
        ) else (
            echo sys file
        )
)
于 2013-08-24T02:22:03.193 に答える