Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用echo从windows批处理文件中获取相对路径?_Windows_Batch File_Echo_Text Formatting - Fatal编程技术网

如何使用echo从windows批处理文件中获取相对路径?

如何使用echo从windows批处理文件中获取相对路径?,windows,batch-file,echo,text-formatting,Windows,Batch File,Echo,Text Formatting,如何从windows.bat文件中获取相对目录/部分路径以显示为echo输出 什么都谈,但不谈 我找到了驱动器号、文件名、扩展名、缩写(8.3)名和完整路径,但没有相对路径 我正在运行一个递归的FOR/R循环;它遍历子目录。我想要的东西-没有二十个无用的路径信息字符-告诉我每个重复文件所在的目录。。。没有将.bat文件硬编码到某个目录/路径中 也许一个解决方案是测量脚本路径的长度,并将其从完整路径的前端截断?但我不知道如何操纵它 脚本可能位于多个位置: F:\a.bat<BR> F

如何从windows.bat文件中获取相对目录/部分路径以显示为echo输出

什么都谈,但不谈

我找到了驱动器号、文件名、扩展名、缩写(8.3)名和完整路径,但没有相对路径

我正在运行一个递归的
FOR/R
循环;它遍历子目录。我想要的东西-没有二十个无用的路径信息字符-告诉我每个重复文件所在的目录。。。没有将.bat文件硬编码到某个目录/路径中

也许一个解决方案是测量脚本路径的长度,并将其从完整路径的前端截断?但我不知道如何操纵它

脚本可能位于多个位置:

F:\a.bat<BR>
F:\Dir1\fileA.txt<BR>
F:\Dir20\fileA.txt

C:\Users\Longusername\Desktop\Container\a.bat<BR>
C:\Users\Longusername\Desktop\Container\Dir1\fileA<BR>
C:\Users\Longusername\Desktop\Container\Dir20\fileA
它不会告诉我每个文件在哪个目录中…或者(
%%~pnxG

我想要的是,从任何地点:

\Dir1\fileA.txt
\Dir20\fileA.txt

可能缺少开头的
\
,但这可以忽略不计。如果echo以外的其他选项适用于大多数窗口机器,则可以使用。不过,它们可能会导致更多的问题,因为我已经用echo解决了我的其他问题。

如果您仔细想想,这很容易:只需删除当前目录路径(
%cd%
):


顺便说一句:
\folder\file
总是指驱动器的根目录(
x:\folder\file
),因此它不是一个精确的相对路径。

这与已经接受的答案类似,但仅在需要时启用延迟扩展。这将正确输出包含
的文件名字符

@Echo关闭
SetLocal DisableDelayedExpansion
设置“TopLevel=C:\Users\LongUserName”
对于(“*.txt”)中的/R“%TopLevel%”%%A,请执行以下操作(
设置“u=%%A”
SetLocal EnableDelayedExpansion
Echo=!\u173%TopLevel%=!
端部
)
暂停
您还可以使用
Set“TopLevel=%~dp0”
,(运行脚本的目录)或
Set“TopLevel=%~dp0..”
,(运行脚本的父目录)
上述方法的一个潜在好处是,您还可以使用相对于当前目录的位置作为
%TopLevel%
的值(在这种情况下,根据初始示例,当前目录将是
C:\Users
):

设置“TopLevel=LongUserName”
尽管只有当
LongUserName
在树的前面没有作为路径的内容存在时,这才可以正常工作。

您可以与其
/S
(包括子目录)和
/L
(列表但不复制)选项一起使用,因为它返回相对路径,因此,您不必执行任何字符串操作,这有时可能有点危险,特别是当当前目录是驱动器的根目录时:

xcopy/L/S/I/Y/R“\*.txt”“查找”
附加的内容构成一个过滤器,用于从输出中删除摘要行
#文件


要捕获上述命令行的输出,只需使用:

for/F“delims=“%%I in('
xcopy/L/S/I/Y/R“\*.txt”“查找”
""做"(
rem//对每一项都做些什么:
回声/%%I
)

完美。我没有找到当前目录。应该更仔细一点。这总是显而易见的,很难看到<代码>;)
\Users\Longusername\Desktop\Container\Dir1\fileA.txt
\Users\Longusername\Desktop\Container\Dir20\fileA.txt
\Dir1\fileA.txt
\Dir20\fileA.txt
@echo off 
setlocal enabledelayedexpansion
for /r %%a in (*.txt) do (
  set "x=%%a"
  echo with \:    !x:%cd%\=\!
  echo without \: !x:%cd%\=!
)