gpt4 book ai didi

用于查找正确父文件夹的 Windows 批处理脚本

转载 作者:可可西里 更新时间:2023-11-01 14:13:52 27 4
gpt4 key购买 nike

我有一个我无法弄清楚的简单问题:我想找到一个包含特定文件的父文件夹,并生成该父文件夹的绝对路径 - 这需要在批处理脚本中完成 - 否powershell,没有 perl,没有 python...

例如,假设这是我的目录树:

  root_parent_path
dir0
dir1
file1
dir2
dir21
dir22
dir3
dir31
dir32

在上面的示例中,root_parent_path 的格式为 c:\folder1\folder2\

结果应存储在环境变量中,例如 RESULT_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

变量 RESULT_PATH 应设置为 root_parent_path\dir1,因为它是包含 file1 的父级。 (我不在乎是否有多个或没有父文件夹 - 我会确保只有一个。)

非常感谢您的帮助,在这上面浪费了很多时间...

注意:如果代码也有解释,我将不胜感激!如果两个答案都提供了有效的解决方案,我会选择解释得更好的那个。

最佳答案

对不起。你的问题中有几点我不清楚。

  • 如果 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"

关于用于查找正确父文件夹的 Windows 批处理脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com