DOSコマンドで現在のフォルダー名を取得しますか?


59

DOSコマンドを使用して、現在のフォルダー名(現在のディレクトリパスではない)を取得することは可能ですか?もしそうなら、どのように?

私が得た最も近いものはこれでしたが、それはしません:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

注:上記の試みは、文字列をトークン化して、CURR変数として設定された最後のトークンを取得しようとしたことです。


何らかの種類のGNUツールセットがインストールされている場合、cd | sed "s/.*\\//"(cd(cwd)の出力を正規表現の検索と置換にパイプし、最後の\の前のすべてをまったく何も置き換えない)
Phoshi

2
バッチファイルが誰でもどこでも動作するように、GNUツールを避ける必要があります。私の質問は、とにかく「純粋なDOS」です。
djangofan

わかった。クイックグーグルは、同じ構文を使用して同じ結果を作成できるVBScript(stackoverflow.com/questions/127318/…)で正規表現検索と置換を実装するためのSO結果を示しました-VBScriptはWindows 98以降に組み込まれていると思います誰にとってもどこにでもあるべきです!(* nix OSで動作するように
再調整

3
for /f参考までに、TomWijも%~n*MS-DOSではサポートされていません。(Windows cmd.exeDOSではなく、ネイティブのWindowsプログラムです。)
grawity

回答:


84

私が見つけた最短の方法:

for %I in (.) do echo %~nxI

または.batスクリプト内:

for %%I in (.) do echo %%~nxI

または、変数の値を取得する.bat内。

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

説明:http : //www.robvanderwoude.com/ntfor.php

nxはファイル名と拡張子のみを意味します


私はリンクと提案が好きですが、それをバッチファイルに入れると、出力なしでシェルをすぐに閉じます。どこかに構文エラーがあるはずですか?
djangofan

3
この例は、コマンドラインで対話的に機能します。バッチファイルでそれを使用するには、のすべての出現交換する必要がある%とし%%
マイクフィッツパトリック

2
また、この例では.、%USERPROFILE%フォルダーなど、ピリオド()を含むフォルダー名を正しく処理しません。
マイクフィッツパトリック

1
はい、「%」を「%%」に置き換えても機能します。素敵な答え。それが以前に指摘された場合、受け入れられた答えだっただろう。
-djangofan

1
この神に悪い悪魔の魔術が何であれ、それが機能することを嬉しく思います。私はほとんどの拡張構文に精通していますが、*oo
kayleeFrye_onDeckで

30

バッチファイルの現在の場所を知りたい場合(およびWindowsが非常に古いリリースではない場合)、for /?「DOSボックス」ウィンドウに入力します。下へスクロール。読む。

次の変数を(バッチファイルから)読み取ることができることがわかります。

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

これは多くの場合に機能します。バッチファイルの名前はであるとしmytest.batます。さまざまな方法で呼び出すことができます。

  1. ..\..\to\mytest.bat ............................... (相対パス)
  2. d:\path\to\mytest.bat........................... (フルパス)
  3. \\fileserver\sharename\mytest.bat... (リモート共有上のパス)

...そして、常に変数に正しい値を取得します。


1
おっと、面白いことにあなたの権利。コマンド "echo%〜dp0"は私の問題も解決し、よりエレガントになります。
djangofan

5
わかりました。それでは「+1」を授与してください。
カートPfeifle

いいえ、「/のために」という理由で 私が見た明らかな最初の場所だったので、この答えは誰もが期待するものよりも良くありません。
djangofan

4
@djangofan:それで、あなたは「うわー、おもしろいことにあなたは正しい...」とあなたはすでに知っている何かに言いますか?!あなたの知識に貢献しなかった答えに?(ご存知のように、「+ 1」は^-矢印をクリックしています。これは、回答を承認済みのものにすることとは異なります....)
カートフェイフル

1
最後のものはそうであるように思われ%~dpnx0ますよね?
luc


5

トムの答えは良いのですが、ピリオドを含むディレクトリ名(wxwidgets-2.9.4など)がある場合は、フルネームしか取得できません。.4は拡張子として扱われているため、代わりにwxwidgets-2.9が出力されます(はい、ディレクトリ名でも!)。

完全な出力名を取得するには、拡張子を最後に追加する必要があります。

FOR %I IN (.) DO Echo %~nI%~xI

バッチファイルモードの場合:

FOR %%I IN (.) DO Echo %%~nI%%~xI

またはもちろん、代わりにバッチファイルで変数を設定します。

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

別の方法は次のとおりです。

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

「。」で動作します およびパス名のスペース

それは何をするためのものか?

  1. ファイル名全体(driveletter-path-filename-extension)をMyPathVarに入れます

  2. MyPathvar からファイル名と拡張子を削除します

UNCパスでも機能します。パスの最後にバックスラッシュが必要な場合。2番目のsetコマンドの\after MyPathを削除します。

set "MyPath=%%MyPath:%~nx0=%%"

1
だからこれはどう違います%~dp0
アミットNaidu

4

現在のディレクトリを変数に取得できます。一発ギャグ:

set a=%cd%

確認する

echo %a%

6
彼は、パス全体ではなく現在のディレクトリ名を望んでおり、a == cdとして、%cd%も使用できます。
パラドロイド

2

単純な

for %%d in ("%CD%") do echo %%~nxd

または

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

パスの末尾のバックスラッシュに注意してください。末尾のバックスラッシュである必要はありません。


1

このスレッドでの私の答えは、3つの簡単な行でそれを行います。

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

これは、バッチファイルから動作します。現在の作業ディレクトリ名を返します。

pushd %1 & for %%i in (.) do @echo %%~ni
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.