すみません。あなたの質問には、私にははっきりしない点がいくつかあります。
root_parent_path
ディレクトリツリーで示したように、フォルダがディスクのルートフォルダ内に配置されている場合は、次のように名前の前に円記号を含める必要\root_parent_path
があります。これが当てはまる場合、結果root_parent_path\dir1
は相対パスではなく、ディスクのルートフォルダから次のように開始する絶対パスになります\root_parent_path\dir1
。以下のバッチファイルはこの点を想定しており、2番目のパラメータの前に円記号を挿入していることに注意してください。
私が理解しているように、最初のパラメーターで指定されたファイルを含む、2番目のパラメーターで指定されたパスの最初のフォルダーが必要です。このバッチファイルはそれを行います:
編集:このバッチファイルは、2番目のパラメーターで完全修飾パスを受け入れるように変更されました
@echo off
setlocal EnableDelayedExpansion
rem Get drive from second parameter, given or implied
for %%a in (%2) do set drive=%%~Da
rem Extract each partial path from second parameter and search first parameter into it
set return_path=
set param2=%2
rem Delete drive from second parameter, if any
set param2=%param2:*:=%
for %%a in (%param2:\= %) do (
set return_path=!return_path!\%%a
if exist %drive%!return_path!\%1 goto continue
)
set return_path=PATH NOT FOUND
:continue
echo %drive%%return_path%
この結果は絶対パスであることを忘れないでください。上記の例での相対パスの結果は、次の値になります。
script.batch file1 root_parent_path\dir1\dir2 -> ..
script.batch file1 root_parent_path\dir1\dir2\dir21 -> ..\..
script.batch file1 root_parent_path\dir1\dir3\dir31 -> ..\..
パス内の各フォルダにスペースを含めることはできないことに注意してください。これは、必要に応じて修正される場合があります。
プログラムをテストし、結果を報告します...
アントニオ
PD-元の質問で、出力として相対パスが必要であると述べ、入力として相対パスを使用した例を示しました。あなたの答えは相対的なものではなく、ドライブのない絶対的なものであり、私のプログラムはこの状況を想定していることを指摘しました。入力と出力の両方として絶対パスが必要であるというコメントで答える場合、私はすぐにそれを行いますが、もう答えません...
相対パス管理と絶対パス管理は完全に異なり、ディスクドライブが指定または暗示されている場合にも注意する必要があります。最初の質問に2番目のパラメーターが実際に含まれている場合c:\folder1\folder2\
、この点は問題になりません。
編集:2番目のパラメーターでスペースを受け入れる新しいバージョン。
@echo off
setlocal EnableDelayedExpansion
rem Get drive from second parameter, given or implied
for %%a in (%2) do set drive=%%~Da
rem Get second parameter removing enclosing quotes, if any
set param2=%~2
rem Delete drive from second parameter (from beggining of path until first colon)
set param2=%param2:*:=%
rem Change possible spaces in the path by another character (I used dollar sign)
rem to avoid separate names with spaces at that point
set param2=%param2: =$%
rem ... of course, dollars must be returned back to spaces later
rem Extract each partial path from second parameter and search first parameter into it
set return_path=
for %%a in (%param2:\= %) do (
set return_path=!return_path!\%%a
rem Get back spaces converted into dollars
set return_path=!return_path:$= !
rem Enclose file name in quotes (required if path contain spaces)
if exist "%drive%!return_path!\%1" goto continue
)
set return_path=PATH NOT FOUND
:continue
echo %drive%%return_path%
この場合、パスにスペースが含まれている場合は、引用符を使用してパスを囲みます。
script.bat file1 "c:\first dir\second dir\dir1\dir2"