CMDでファイルパスからフォルダパスを取得する方法


151

cmdファイルを含むフォルダーへのパスが必要です。%0を使用すると、ファイル名を取得できます。しかし、フォルダ名を取得するにはどうすればよいですか?

c:\ temp \ test.cmd >> test.cmd

PS私の現在のディレクトリ!=スクリプトのフォルダー。

回答:


310

フォルダー名とドライブには、以下を使用できます。

echo %~dp0

さまざまな修飾子を使用して、より多くの情報を取得できます。

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

The modifiers can be combined to get compound results:
%~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

これは「for /?」からのコピーペーストです。プロンプトでコマンド。それが役に立てば幸い。

関連した

DOSバッチのヒントのトップ10(はい、DOSバッチ...)は、batchparams.batを示しています(要旨としてのソースへのリンク)。

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

涼しい。他の人のWiki投稿を変更するには、特定のスコアが必要ですか?
Wadih M.

@Wadih M:一般に、有用なリンクstackoverflow.com/questions/18557/...は
JFS


@Wadih M .:上記のリンクから:「コミュニティ 'wiki editable'投稿を編集するには
+750

したがって、cmdスクリプトで作業ディレクトリをスクリプトの場所に設定する場合cd /d "%~dp0"stackoverflow.com/questions/4451668から)
Nigel Touch

52

受け入れられた回答は役に立ちますが、渡された値を使用していない場合、パスからファイル名を取得する方法はすぐにはわかりません。私はこのスレッドからこれを解決することができましたが、他の人がそれほど幸運でない場合に備えて、以下にその方法を示します。

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

この:file_name_from_path関数は、引数で渡されるだけでなく、どこでも値を取得するために使用できます。これは、引数を不確定な順序でファイルに渡すことができる場合、またはパスがファイルにまったく渡されない場合に非常に役立ちます。


わおそれは驚きだ!したがって、Windowsバッチファイルは同じファイル内の関数をサポートします。いつこれが可能になったのですか?
ルーク

2
変数を参照(現状のまま)と値( "!"で囲む)の両方で渡すことができるのが好きです。わかりました、おそらく「ローカル」変数とコールスタックはありません...でもねえ:それは結局のところcmdスクリプトなので、とにかく大きな一歩です;)私は同意します。それをいくつかのファイルに分割するよりも:)
ルーク

1
"goto:eof"は "goto eof"である必要があります。
Khudairy 16

2
参照:ss64.com/nt/syntax-args.html-%~dp1ドライブとパスにのみ使用してください。
アンドリュー

2
@AKhudairyは正しいです:ss64.com/nt/goto.htmlコロンを使用すると、gotoはendlocalをスキップします(そして、ポーズのように、その後に置くものはすべてスキップします)。また、パスにスペースが含まれている場合(または引用符がmyPathの一部である場合)に"s を追加する必要があり!myPath!ます
Rick

8

これらを変数に割り当てるには、等号の前後にスペースを入れないでください。

set filepath=%~dp1
set filename=%~nx1

その後、問題はないはずです。


5

誰かが別の方法を望んでいる場合...

パスの最後のサブディレクトリである場合は、次のワンライナーを使用できます。

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

これは以下を返します:

c:\directory\subdirectory

....は前のディレクトリに戻ります。/ adはディレクトリのみを表示します/ bはベアフォーマットリストです/ sはすべてのサブディレクトリを含みます これは、印刷するディレクトリの完全パスを取得するために使用されます。


おそらく、スクリプトファイルが置かれているディレクトリではなく、現在のディレクトリに対して機能します。
Mike Chaliy、2014年

4

同じディレクトリでzipファイルを抽出してから、zipファイルを削除したいというループでも同じ問題が発生しました。問題は、7zには出力フォルダーが必要であるため、各ファイルのフォルダーパスを取得する必要があったことです。これが私の解決策です:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% iは完全なファイル名のパスであり、%ii \ ..は単に親フォルダを返します。

それが役に立てば幸い。


早くて汚い。私はすきです!"\ .."を使用してファイルパスをコールド拡張し、最終的に親フォルダーになるとは思わなかった。
Oliver R.

これはWin10で私にとってはうまくいきました:FOR / R "C:\ sourceDir"%I IN(* .gz)DO C:\ 7-Zip64 \ 7z.exe x "%I" -aou -o%I \ .. \
b3wii 2018年

はい!これは、%〜dp1(など)が%0、%1、%2などでのみ機能するという問題を回避します
Artelius


0

これはいくつかの編集された例のコマンドと一緒にまとめられました

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

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