ファイル拡張子なしで現在実行中のバッチ ファイルの名前を取得したい。
このリンクのおかげで、拡張子が付いたファイル名が得られました...しかし、バッチファイルで部分文字列を実行する最良の方法は何ですか?
または、拡張子なしでファイル名を取得する別の方法はありますか?
このシナリオでは、3 文字の拡張子を想定しても安全です。
ファイル拡張子なしで現在実行中のバッチ ファイルの名前を取得したい。
このリンクのおかげで、拡張子が付いたファイル名が得られました...しかし、バッチファイルで部分文字列を実行する最良の方法は何ですか?
または、拡張子なしでファイル名を取得する別の方法はありますか?
このシナリオでは、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%
環境変数の位置 10 から 5 文字を抽出します%var%
。
注:文字列のインデックスは 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%
から最後の 7 文字を抽出します%var%
%var:~0,-4%
最後の 4 文字を除くすべての文字を抽出すると、ファイル拡張子も削除されます (ピリオド [ .
] の後の 3 文字を想定)。help set
その構文の詳細については、を参照してください。
以上、わかりやすく解説!
私のように、ローカライズされた Windows (私の場合はスロバキア語の XP) でこれを動作させるのに苦労する可能性があるすべての人は、を に置き換えてみてください%
。!
そう:
SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
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 つの修飾子を使用すると、ファイル名が再び表示されます!