DOSでファイルの親ディレクトリの名前を見つける必要があります
例.
これがディレクトリだとします
C:\test\pack\a.txt
ファイル名を尋ねるスクリプトがあります
C:\\>getname.bat
enter file name: c:\test\pack\a.txt
これで、スクリプトはファイルの親名だけを返すはずです。
pack
ファイルへの親パス全体ではありません。
c:\test\pack
this 質問を参照してください
@echo OFF set mydir = "%〜p1" SET mydir =%mydir:\ =;% for/F "tokens = * delims = ; " %% i IN(%mydir%)DO call:LAST_FOLDER %% i goto:EOF :LAST_FOLDER if "%1" == "" ( @ echo%LAST% goto:EOF ) set LAST =%1 SHIFT goto:LAST_FOLDER
親ディレクトリ名にスペースが含まれている場合、上記の最初の回答は機能しません。次の作品:
@echo off
setlocal
set ParentDir=%~p1
set ParentDir=%ParentDir: =:%
set ParentDir=%ParentDir:\= %
call :getparentdir %ParentDir%
set ParentDir=%ParentDir::= %
echo ParentDir is %ParentDir%
goto :EOF
:getparentdir
if "%~1" EQU "" goto :EOF
Set ParentDir=%~1
shift
goto :getparentdir
「C:\ Temp\ParentDir With Space\myfile.txt」のパラメーターを指定して上記を呼び出すと、次のようになります。
>GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt"
ParentDir is Parent Dir With Space
上記は、スペースをコロンに置き換え(これらはWindowsパスに存在してはなりません)、ディレクトリ区切り文字をスペースに置き換えて、個々のディレクトリが個別の引数としてgetparentdirに渡されるようにすることで機能します。関数getparentdirは、最後の引数が見つかるまでループします。最後に、結果のコロンはすべてスペースに置き換えられます。
バッチファイルの親フォルダを取得するのは非常に簡単です。
@echo off
for %%a in ("%~dp0\.") do set "parent=%%~nxa"
echo %parent%
そして、質問によるファイルパスの親の場合:
@echo off
for %%a in ("c:\test\pack\a.txt") do for %%b in ("%%~dpa\.") do set "parent=%%~nxb"
echo %parent%
DaDummyのアイデアは、より実用的な再利用可能な関数でうまくいきました。また、_full_pathの最初の文字が含まれるようになりました。
set map=D:\test1\test2\test3\test4.txt
call:get_parent_path "%map%"
echo full_path is %_full_path%
call:get_parent_path %_full_path%
echo full_path is %_full_path%
call:get_last_path %_full_path%
echo last_path is %_last_path%
goto :eof
:get_parent_path
set "_full_path=%~dp1"
:_strip
if not "%_full_path:~-1%"=="\" if not "%_full_path:~-1%"=="/" goto:_strip_end
set "_full_path=%_full_path:~0,-1%"
goto:_strip
:_strip_end
exit /b
:get_last_path
set "_last_path=%~nx1"
exit /b
::result:
::full_path is D:\test1\test2\test3
::full_path is D:\test1\test2
::last_path is test2
スクリプトの親ディレクトリを検索すると、djangofanとparanoidの回答からのこのアプローチの組み合わせは、単純で完全に十分であることがわかりました。
set FULL_PATH=%~dp0
set FULL_PATH=%FULL_PATH:~1,-1%
for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni"
echo %PARENT_FOLDER%
代わりにユーザー入力を処理したいので、C:\ foo\bar\a.txtとC:\ foo\bar\a.txtまたはc:/のような法的なバリエーションを処理するために、最小限の追加作業を行う必要があります。 foo/bar /a.txt。これはあなたのために働くかもしれません:
@setlocal
@echo off
call:GET_PARENT_FOLDER C:\foo\bar\a.txt
echo %PARENT_FOLDER%
call:GET_PARENT_FOLDER C:\foo\bar\\a.txt
echo %PARENT_FOLDER%
call:GET_PARENT_FOLDER c:/foo/bar/a.txt
echo %PARENT_FOLDER%
pause
goto:EOF
:GET_PARENT_FOLDER
:: Strip the filename, so we get something like this: 'C:\foor\bar\'
set "_FULL_PATH=%~dp1"
:: Strips all dangling '\' and '/' in a loop, so the last folder name becomes accessible
:_STRIP
if not "%_FULL_PATH:~-1%"=="\" if not "%_FULL_PATH:~-1%"=="/" goto:_STRIP_END
set "_FULL_PATH=%_FULL_PATH:~1,-1%"
goto:_STRIP
:_STRIP_END
:: We need the context of a for-loop for the special path operators to be available
for %%i in ("%_FULL_PATH%") do set "PARENT_FOLDER=%%~ni"
goto:EOF
vbscriptを使用できます。たとえば、以下をgetpath.vbs
として保存します。
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
WScript.Echo objFS.GetParentFolderName(strFile)
次に、コマンドラインまたはバッチでこれを実行します
C:\test>cscript //nologo getpath.vbs c:\test\pack\a.txt
c:\test\pack
バッチ方式が必要な場合は、for /?
を参照してください。
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
これはCALL
を使用しない方法で、より高速だと思います。 jebの分割関数に基づく (ディレクトリ名に!
が含まれていると失敗する可能性があります):
@echo off
set "mydir=%~p1"
SET mydir=%mydir:~0,-1%
setlocal EnableDelayedExpansion
set LF=^
rem ** Two empty lines are required
for %%L in ("!LF!") DO (
set "dir_name=!mydir:\=%%L!"
)
for /f "delims=" %%P in (""!dir_name!"") do set "dn=%%~P"
echo %dn%
exit /b 0
別の解決策は次のとおりです。
SET LAST=%CD%
SET PARENTNAME=NONE
cd /D C:\test\pack
FOR %%I in (%CD%) do SET PARENTNAME=%%~nI
cd /D %LAST%
ECHO %PARENTNAME%
%% 〜nI: '〜n'は、%% I変数に格納されているパスから名前を抽出します
cd:ディスクを切り替えるための「/ D」パラメータも追加されました