現在実行中のバッチファイルの名前をファイル拡張子なしで取得したい。
このリンク のおかげで、ファイル名にの拡張子が付きましたが...バッチファイルのサブストリング?
または拡張子なしでファイル名を取得する別の方法はありますか?
このシナリオでは3文字の拡張子を想定するのが安全です。
さて、あなたのバッチのファイル名を得るための最も簡単な方法は単に%~n0
を使うことでしょう。
@echo %~n0
現在実行中のバッチファイルの名前(拡張子なし)を出力します(call
によって呼び出されるサブルーチンで実行されない限り)。パス名のそのような「特別な」置換の完全なリストは、ヘルプの最後にあるhelp for
で見つけることができます。
さらに、FOR変数参照の置換が強化されました。これで、次のオプションの構文を使用できます。
%~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
修飾子を組み合わせて複合的な結果を得ることができます。
%~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only
正確にあなたの質問に答えるために、ただし:サブストリングは:~start,length
表記法を使用して行われます:
%var:~10,5%
環境変数%var%
の位置10から5文字を抽出します。
注:文字列のインデックスは0から始まるので、最初の文字は位置0にあり、2番目の文字は1にあります。
%0
、%1
などの引数変数の部分文字列を取得するには、まずset
を使用してそれらを通常の環境変数に割り当てる必要があります。
:: Does not work:
@echo %1:~10,5
:: Assign argument to local variable first:
set var=%1
@echo %var:~10,5%
構文はさらに強力です。
%var:~-7%
は%var%
から最後の7文字を抽出します%var:~0,-4%
は最後の4文字を除いてすべての文字を抽出し、それもファイル拡張子を取り除きます(ピリオド[.
]の後に3文字を仮定)。その構文の詳細についてはhelp set
を参照してください。
上でうまく説明しました!
私のようにローカライズされたWindowsで動作させることに苦しむすべての人(私のものはスロバキア語でXP)で、あなたは%
を!
に置き換えることを試みるかもしれません
そう:
SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
Joeyの答えに対する追加情報として、これはset /?
とfor /?
の助けには記載されていません。
%~0
は、入力されたとおりに、独自のバッチの名前に展開されます。
それであなたがあなたのバッチを始めるならば、それは以下のように展開されます
%~0 - mYbAtCh
%~n0 - mybatch
%~nx0 - mybatch.bat
ただし、例外が1つあります。サブルーチンでの展開は失敗する可能性があります。
echo main- %~0
call :myFunction
exit /b
:myFunction
echo func - %~0
echo func - %~n0
exit /b
この結果
main - myBatch
Func - :myFunction
func - mybatch
関数内では%~0
はバッチファイルではなく、常に関数名に展開されます。
しかし、少なくとも1つの修飾子を使用すると、再びファイル名が表示されます。