【发布时间】:2011-01-12 10:43:52
【问题描述】:
批处理文件中的以下命令无法按预期/希望工作:
echo %~nxs1
这是我想要得到的示例显示:
C:\>type test.bat
@dir /b %1
@echo %~nxs1
C:\>test "C:\Documents and Settings\All Users\ntuser.dat"
ntuser.dat
NTUSER.DAT
C:\>test "C:\Documents and Settings\All Users\ntuser.data"
ntuser.data
NTUSER~1.DA~
C:\>test "C:\Documents and Settings\All Users\ntuser.dat.baz"
ntuser.dat.baz
NTUSER~1.BAZ
C:\>test "C:\Documents and Settings\All Users\foo.bar.baz"
File Not Found
foo.bar.baz (or FOO~1.BAZ or whatever, doesn’t really matter since
file does not exist, though latter would be nice)
相反,我得到的是以下内容(取决于分配的短文件名):
C:\>type test.bat
@dir /b %1
@echo %~nxs1
C:\>test "C:\Documents and Settings\All Users\ntuser.dat"
ntuser.dat
s\ntuser.dat
C:\>test "C:\Documents and Settings\All Users\ntuser.data"
ntuser.data
s\ntuser.data
C:\>test "C:\Documents and Settings\All Users\ntuser.dat.baz"
ntuser.dat.baz
z
C:\>test "C:\Documents and Settings\All Users\foo.bar.baz"
File Not Found
s\foo.bar.baz
基本上,我需要将文件名传递给 BAT 文件并让脚本将其作为短文件名获取(例如显示),但只有文件名和扩展名,没有驱动器或路径。
FOR 的帮助信息以 %~fsI 为例,但它具有整个路径作为短文件名,而不仅仅是文件。有谁知道如何组合 %~ 中的 S 参数而不获取整个路径?
非常感谢。
更新
我不是在寻找其他语言的解决方案,我需要 BAT 命令才能工作。
它似乎适用于其他人,所以我正在检查它是否是某种替代配置问题。我目前正在测试命令处理器扩展是否可能是原因。
如果扩展被禁用(显然),它根本不起作用,所以我继续假设它是在后续服务包中修复的错误(我测试的系统是 XP SP1)。我今天正在测试 SP2 和 SP3……
【问题讨论】:
-
执行您的示例脚本没有问题。
-
你的脚本在 WinXP 上对我有效
标签: batch-file filenames command-line-arguments substitution