打扰一下。你的问题有几点我不清楚。
如果root_parent_path
是放置在磁盘根文件夹内的文件夹,如您在目录树中指出的那样,那么它必须在其名称前包含一个反斜杠:\root_parent_path
,对吗?如果这是真的,那么结果root_parent_path\dir1
不是相对路径,而是从磁盘的根文件夹开始的绝对路径:,对吗?请注意,下面的批处理文件假定这一点并在第二个参数之前插入反斜杠。\root_parent_path\dir1
据我了解,您希望第二个参数给出的路径中的第一个文件夹包含第一个参数中给出的文件。这个批处理文件这样做:
编辑:此批处理文件已被修改为在第二个参数中接受完全限定的路径
@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 - 在您的原始问题中,您说您想要一个相对路径作为输出,并以相对路径作为输入的示例。我注意到您的回答不是相对的,而是绝对的,没有驱动器,并且我的程序假设了这种情况。如果您在评论中回答您希望将绝对路径作为输入和输出,我会立即这样做,但您不再回答......
您必须注意,相对路径管理和绝对路径管理是完全不同的,而且如果磁盘驱动器是给定的或暗示的。如果您的第一个问题将包含第二个参数,因为它实际上是: c:\folder1\folder2\
,那么这一点不会有问题。
编辑:在第二个参数中接受空格的新版本。
@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"