Windowsバッチファイルは独自のファイル名を決定できますか?
たとえば、バッチファイルC:\ Temp \ myScript.batを実行した場合、myScript.bat内に文字列 "myScript.bat"を判別できるコマンドはありますか?
Windowsバッチファイルは独自のファイル名を決定できますか?
たとえば、バッチファイルC:\ Temp \ myScript.batを実行した場合、myScript.bat内に文字列 "myScript.bat"を判別できるコマンドはありますか?
回答:
はい。
特殊%0
変数を使用して、現在のファイルへのパスを取得します。
%~n0
拡張子なしのファイル名のみを取得するように書き込みます。
%~n0%~x0
ファイル名と拡張子を取得するために書き込みます。
%~nx0
ファイル名と拡張子を取得するために書き込むこともできます。
cd
最初のディレクトリにして、そこからバッチを実行、%0は通常、パス情報を持っていません(ただし、そのような場合における%でcd%から得ることができる)
%cd%
、バッチファイルを呼び出したプロセスの現在のディレクトリを返します。したがって、プロンプトが表示されD:\dir1
てEnter キーを押したY:\foo\bar.bat
場合bar.bat
は@echo %cd%
、それが出力されますD:\dir1
。
ファイル名を取得できますが、「%〜」と「0」の間に何を配置するかによって、フルパスを取得することもできます。から選ぶ
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
たとえば、c:\ tmp \ foo.batの内部から%~nx0
は「foo.bat」が返され、%~dpnx0
「c:\ tmp \ foo.bat」が返されます。ピースは常に正規の順序で組み立てられることに注意してください。したがって、キュートになって試してみると%~xnpd0
、「c:\ tmp \ foo.bat」がまだ得られます
f
は、それがファイル名であることを示していますが、例n
ではファイル名に使用しています。いくつかのテストの後、それf
は完全なパスでありn
、ファイル名です。
%~xnpd0
」愛してる
以下のスクリプトを使用して、SLaksの回答に基づいて、正しい答えは次のとおりであると判断しました。
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
そして、これが私のテストスクリプトです:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
私が興味深いと思うのは、%nx0が機能しないことです。通常、変数の引用符を取り除くために「〜」文字が使用されていることがわかっています。
これ0
は、バッチファイル内のパラメータ番号の特殊なケースであることに注意してください。ここで、はコマンドラインで指定されたこのファイルを0
意味します。
したがって、ファイルがmyfile.batの場合、次のようにいくつかの方法で呼び出すことができます。それぞれの方法で、またはの使用法から異なる出力が得られます。%0
%~0
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
上記のすべては、それが存在するディレクトリへの相対的な正しい場所から呼び出す場合、正当な呼び出しです。 %~0
最後の例から引用を取り除きますが、取り除き%0
ません。
これらのため、すべては異なる結果を与え、%0
そして%~0
あなたが実際に使用したいものであることが非常に低いです。
ここに説明するバッチファイルがあります。
@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause
魔法の変数がどのように機能するかを感じるために、以下の例を実行してみてください。
@echo off
SETLOCAL EnableDelayedExpansion
echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with extension: %~nx0
echo Extension: %~x0
echo date time : %~t0
echo file size: %~z0
ENDLOCAL
関連ルールは以下の通りです。
%~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
@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
%〜0および%0で指定されたファイル名は、コマンドシェルでの入力方法であり、そのファイルの実際の名前付け方法ではないことに気付きました。したがって、ファイル名に大文字と小文字を区別したい場合は、%〜n0を使用する必要があります。ただし、これによりファイル拡張子は省略されます。ただし、ファイル名がわかっている場合は、次のコードを追加できます。
set b=%~0
echo %~n0%b:~8,4%
「:〜8,4%」は、変数の9番目の文字から開始し、次の4文字を表示することを知っています。範囲は0から変数文字列の終わりまでです。したがって、%Path%は非常に長くなります。
fIlEnAmE.bat
012345678901
ただし、これは上記のJoolの解決策(%〜x0)ほどは健全ではありません。
C:\bin>filename.bat
%0.......filename.bat
%~0......filename.bat
. . .
C:\bin>fIlEnAmE.bat
%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\
%~n0%b:~8,4%...FileName.bat
Press any key to continue . . .
C:\bin>dir
Volume in drive C has no label.
Volume Serial Number is CE18-5BD0
Directory of C:\bin
. . .
05/02/2018 11:22 PM 208 FileName.bat
@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
%0
あなたが探しているものです。詳細については、[この質問] [1]を参照してください。[1]:stackoverflow.com/questions/357315/…–