388

次の変数を定義するバッチ ファイルを見ています。

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • とはどういう意味ですか%~d0?%~p0
  • 現在のディレクトリ、ドライブ、スクリプトへのパラメーターなどの既知の値のセットはありますか?
  • 私が使用できる他の同様のショートカットはありますか?
4

9 に答える 9

594

マジック変数%nには、ファイルを呼び出すために使用される引数が含まれてい%0ます。%1%2

多くの場合、引数はファイル パスであるため、パスの一部を抽出するための追加の構文があります。~dはドライブ、~pはパス (ドライブなし)、~nはファイル名です。それらは組み合わせることができるので~dp、ドライブ + パスも同様です。

%~dp0したがって、バットで非常に便利です。これは、実行中のバットファイルが存在するフォルダーです。

ファイルに関する他の種類のメタ情報も取得できます:~tはタイムスタンプ、~zはサイズです。

すべてのコマンド ライン コマンドのリファレンスについては、こちらを参照してください。チルダ マジック コードについては、 で説明ます。

于 2008-09-21T20:57:34.050 に答える
167

これらは拡張された変数置換です。バッチ ファイルで使用される %N 変数を変更します。Windows でのバッチ プログラミングに興味がある場合は、非常に便利です。

%~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

を実行すると、上記を見つけることができますFOR /?

于 2008-09-21T20:55:38.627 に答える
51

はい、以下に示す他のショートカットを使用できます。コマンドでは、〜d0は0番目の引数のドライブ文字を意味します。

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

0番目の引数はスクリプトパスであるため、パスのドライブ文字を取得します。次のショートカットも使用できます。

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 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    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

これは、CALL /?を実行したときにコマンドプロンプトで直接見つけることもできます。またはFOR/?

于 2012-09-18T20:49:21.513 に答える
12

バッチファイルでのファイル名の解析とその他のイディオムから - Real's How- to :

スクリプトがあるパス (ドライブなし): ~p0

スクリプトがあるドライブ: ~d0

于 2008-09-21T20:44:03.507 に答える
7

%~d0引数 0 (スクリプト名) のドライブ文字%~p0、パスを提供します。

于 2008-09-21T20:44:20.713 に答える
7

注意すべき点:

バッチ ファイルをダブルクリック%0すると、引用符で囲まれます。たとえば、このファイルを次のように保存するとしますc:\test.bat

@echo %0
@pause

それをダブルクリックすると、新しいコマンド プロンプトが開き、出力が表示されます。

"C:\test.bat"

ただし、最初にコマンド プロンプトを開いて、そのコマンド プロンプトから直接呼び出すと、入力した内容%0が参照されます。と入力すると、引用符を入力しなかったため、 の出力には引用符がありません。test.batEnter%0

c:\>test.bat
test.bat

と入力すると、拡張子を入力しなかったためtestEnter、 の出力に%0も拡張子がありません。

c:\>test
test

についても同じ tEsTEnter:

c:\>tEsT
tEsT

と入力する"test"Enterと、の出力に%0は引用符が付きますが (入力したため)、拡張子はありません。

c:\>"test"
"test"

最後に、 と"C:\test.bat"入力すると、ダブルクリックした場合とまったく同じ出力が得られます。

c:\>"C:\test.bat"
"C:\test.bat"

%0他のフォルダーからスクリプトを呼び出すことができるため、これらがすべての可能な値ではないことに注意してください。

c:\some_folder>/../teST.bAt
/../teST.bAt

上記の例はすべて にも影響します%~0。これは、 の出力%~0が単に%0 マイナス引用符 (存在する場合) の出力であるためです。

于 2015-08-11T12:06:34.093 に答える
3

このコードは ~tilde 文字の使用法を説明していますが、これは私にとって最も紛らわしいものでした。これを理解すると、物事がはるかに理解しやすくなります。

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
于 2012-12-12T16:13:50.260 に答える