Cmd 这是合法的吗;把戏;要获取执行批处理文件的文件夹?

Cmd 这是合法的吗;把戏;要获取执行批处理文件的文件夹?,cmd,Cmd,我正在调试一个复杂的脚本,该脚本在具有标准8dot3name约定的windows 10系统上“正常工作”(即使有错误),但在缩短的名称不符合“标准”(不管是什么)时失败 我的测试批处理文件是“runtest.bat”,它位于我的“documents\win\u build”文件夹中 输出是 C:\Users\josep\Documents\WIN_BUILD>runtest.bat 1------C:\Users\josep\DOCUME~1\WIN_BU~1\ 2------C:\Use

我正在调试一个复杂的脚本,该脚本在具有标准8dot3name约定的windows 10系统上“正常工作”(即使有错误),但在缩短的名称不符合“标准”(不管是什么)时失败

我的测试批处理文件是“runtest.bat”,它位于我的“documents\win\u build”文件夹中

输出是

C:\Users\josep\Documents\WIN_BUILD>runtest.bat
1------C:\Users\josep\DOCUME~1\WIN_BU~1\
2------C:\Users\josep\DOCUME~1
需要的输出是正确的第2行。请注意,后面没有重要的反斜杠***

我遇到的问题是,
win_bu~1
它并不总是短名字。在我的NFS上,win_build的简称实际上是
WOH7UM~G
,构建脚本将失败

我可以用它来获得实际的缩写名

for %%I in (.) do SET SHORT_WIN_BUILD=%%~nsxI
上面给出的win_bu~1或WOH7UM~G都是正确的

当然,有一种更好的方法可以使用缩短的名称来获取不带文件夹的文件夹。我认为这个剧本写得尽可能的迟钝


***
%~dp0
获取当前目录,但其尾部有一个反斜杠,我不知道如何删除该反斜杠,也不希望重新编写脚本来解释额外的反斜杠。

设置“fullbuild=%~dp0”
。然后删除末尾的1个字符:
设置“fullbuild=%fullbuild:~0,-1%”
。不过,这不会删除最后一个目录。但它确实删除了最后一个反斜杠。由于短名称将为8个字符,您可以
设置BUILDROOT=%BUILDROOT:~0,-10%
删除最后10个字符(2个反斜杠和8个短名称字符)。当然,如果将目录重命名为少于8个字符的名称,这将不起作用。%~dp0不会生成短名称,因此必须为-12才能删除“\win\u build\”似乎11应该起作用,但需要12我不确定我是否理解正确(“获取存储批处理文件的文件夹的父文件夹,不一定是短格式”)?如果我这样做:
对于(“%~dp0..”中的%%a,请执行echo%%~fa
谢谢Stephan,这样更好:对于(“%~dp0..”中的%%a,请设置BUILDROOT=%%~fa,无需减去任何内容
for %%I in (.) do SET SHORT_WIN_BUILD=%%~nsxI