web-dev-qa-db-ja.com

バッチファイルで部分文字列を作成するための最良の方法は何ですか?

現在実行中のバッチファイルの名前をファイル拡張子なしで取得したい

このリンク のおかげで、ファイル名の拡張子が付きましたが...バッチファイルのサブストリング?

または拡張子なしでファイル名を取得する別の方法はありますか?

このシナリオでは3文字の拡張子を想定するのが安全です。

179
JosephStyons

さて、あなたのバッチのファイル名を得るための最も簡単な方法は単に%~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を参照してください。

376
Joey

上でうまく説明しました!

私のようにローカライズされたWindowsで動作させることに苦しむすべての人(私のものはスロバキア語でXP)で、あなたは%!に置き換えることを試みるかもしれません

そう:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
35
BrandonSk

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つの修飾子を使用すると、再びファイル名が表示されます。

13
jeb