Windowsバッチファイルは独自のファイル名を決定できますか?


121

Windowsバッチファイルは独自のファイル名を決定できますか?

たとえば、バッチファイルC:\ Temp \ myScript.batを実行した場合、myScript.bat内に文字列 "myScript.bat"を判別できるコマンドはありますか?


1
%0あなたが探しているものです。詳細については、[この質問] [1]を参照してください。[1]:stackoverflow.com/questions/357315/…–
Jonathon Reinhart

2
はい、それは私が探していたものでした。%〜nx0が答えです。
djangofan 2012年

回答:


160

はい。

特殊%0変数を使用して、現在のファイルへのパスを取得します。

%~n0拡張子なしのファイル名のみを取得するように書き込みます。

%~n0%~x0ファイル名と拡張子を取得するために書き込みます。

%~nx0ファイル名と拡張子を取得するために書き込むこともできます。


1
これは不正確です。%0と%〜n0はどちらもファイル名の部分のみを取得します。@djangofanの答えは正しいです。
JustJeff

5
%0は、ファイルが呼び出された方法を返します。フルパスが使用された場合、%0にはそれが含まれます。あなたの場合はcd最初のディレクトリにして、そこからバッチを実行、%0は通常、パス情報を持っていません(ただし、そのような場合における%でcd%から得ることができる)
Gogowitsch

@gogowitsch:よろしいですか?それは本当ではないと思います。
SLaks、2015

Win2012では%cd%、バッチファイルを呼び出したプロセスの現在のディレクトリを返します。したがって、プロンプトが表示されD:\dir1てEnter キーを押したY:\foo\bar.bat場合bar.bat@echo %cd%、それが出力されますD:\dir1
説教師、

48

ファイル名を取得できますが、「%〜」と「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」がまだ得られます


3
コードブロックでfは、それがファイル名であることを示していますが、例nではファイル名に使用しています。いくつかのテストの後、それfは完全なパスでありn、ファイル名です。
ドリューシャピン2015年

@druciferre、私はあなたのコメントに応じて回答を編集しました
robotik

「可愛くなってやってみたら%~xnpd0」愛してる
Mark Deven

32

以下のスクリプトを使用して、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が機能しないことです。通常、変数の引用符を取り除くために「〜」文字が使用されていることがわかっています。


9

これ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

3

魔法の変数がどのように機能するかを感じるために、以下の例を実行してみてください。

@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

0

以下は私の最初のコードです:

@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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.