在 CMD 中将文件名设置为值?

在 CMD 中将文件名设置为值?

我想在文件的右键菜单中创建一个选项,以获取其文件名。我现在的问题是,如何在 CMD 中将文件名设置为值?

我尝试了这个:

    @echo off
    for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo %w%
    )
    pause

w运行后是空的。

答案1

好吧,在我的系统上,您的批处理脚本存在问题,我将对此进行描述,但我不知道为什么您的 w 在运行后为空,但如果您删除 @echo off,您就会明白发生了什么。从这个解释中,也许我们会明白为什么它是空的。一定是 w 的最后一个设置将其设置为无。

    @echo off
    for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo %w%
    )
    pause

上面有一个问题,因为你正在使用%...%for 循环,而%var%for 循环中发生的事情(例如%w%在批处理文件中)与任何其他语言相比都非常奇怪!将%w%被替换为任何东西%w%,之后就不会再替换了。

您可以尝试通过执行 set w=abcdefg 来测试这一点,然后运行批处理文件,看看 w 是否仍然是那样。

但是在我的计算机上,运行 set 之后w=%%~nxf ,然后您会看到 echo %w%%w%在 echo 中,会将 设置为 的当前值%%~nxf,这是您的第一个 bat 文件。就是这样。它会保持原样。毫无疑问,这不是您想要的,但事实就是如此。

这是你的 bat 文件,我已删除@echo。

for /r %%f in (*.bat) do (
set w=%%~nxf
echo %w%
)

以下是显示所发生情况的输出,正如我所描述的那样。%w% 保留其第一个值。

C:\crp>spo <Return>

C:\crp>for /R %f in (*.bat) do (
set w=%~nxf
 echo spo2.bat
)

C:\crp>(
set w=a.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=b.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=spo.bat
 echo spo2.bat
)
spo2.bat

C:\crp>(
set w=spo2.bat
 echo spo2.bat
)
spo2.bat

C:\crp>

您需要添加 setlocal .... 并将 %var% 替换为 !var! 然后您就会获得正常行为!

@echo off
setlocal enableextensions enabledelayedexpansion
for /r %%f in (*.bat) do (
    set w=%%~nxf
    echo !w!
)


C:\crp>spo2
a.bat
b.bat
spo.bat
spo2.bat

C:\crp>

相关内容