web-dev-qa-db-ja.com

DOSバッチスクリプトを使用して、特定のファイルの親ディレクトリ名を取得します

DOSでファイルの親ディレクトリの名前を見つける必要があります

例.

これがディレクトリだとします

C:\test\pack\a.txt

ファイル名を尋ねるスクリプトがあります

C:\\>getname.bat     
enter file name: c:\test\pack\a.txt   

これで、スクリプトはファイルの親名だけを返すはずです。

pack           

ファイルへの親パス全体ではありません。

c:\test\pack   
15
user288167

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
11
asdfg

親ディレクトリ名にスペースが含まれている場合、上記の最初の回答は機能しません。次の作品:

@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は、最後の引数が見つかるまでループします。最後に、結果のコロンはすべてスペースに置き換えられます。

12
duncanm

バッチファイルの親フォルダを取得するのは非常に簡単です。

@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%
10
foxidrive

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
1
GerH

スクリプトの親ディレクトリを検索すると、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
1
DaDummy

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
1
ghostdog74

これは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 
1
npocmaka

別の解決策は次のとおりです。

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」パラメータも追加されました

0
paranoid