set / p未按预期工作

时间:2017-08-28 16:06:46

标签: batch-file cmd set

我正在尝试创建交互式bat文件,该文件要求获取用户选择的文件夹详细信息,但之后无法设置useri.e给出的文件夹路径。它只占用桌面的路径。下面是我的代码:

@echo off
    set /p UserInfo= "Do you have abc software(y/n)?  "
    echo %UserInfo% // here it is working as expected
    IF %UserInfo%==y (
        echo "Reply is true-----"
        set /p Path= "Please enter path for abc directory?  "
        echo %Path% //but here it takes the path till the desktop only(C:\user\username\Desktop)
        CD  %Path%
        dir
        set /p Path1= "Please enter path1 directory path provided in package? "
        echo %Path1% //but here it takes the path till the desktop only(C:\user\username\Desktop)
        CD  %Path1%
        )
    IF %UserInfo%==n (
        echo "Reply is False**************"
        )
    pause

如何阅读文件夹指令?

1 个答案:

答案 0 :(得分:0)

嗯..请使用搜索栏作为用户Magoo,LotPings说。

此外,Stephan& Squashman提到,设置名为path的变量,因为有一个名为path的内部变量。如果重命名,其他程序可能无法正常工作。

什么' DelayedExpansion

运行批处理文件时,cmd逐行处理它们。整个if语句立即得到处理。这就是变量未设置的原因。

由于我们希望cmd在运行时处理这些变量,我们需要通过添加setlocal enableDelayedExpansion告诉它这样做。这样可以实现运行时变量扩展。要停用,只需将enable更改为disable

您可能需要像这样添加它:

@echo off
setlocal enableDelayedExpansion
rem your code follows...

如何使变量获得处理运行时间?

只需将%var%更改为!var!即可。

请注意,for循环元变量%%n无法更改为!!n,因为它本身已经暗示了延迟扩展。

命令行参数%n无法更改为!n。你可能想要这样做:

if "%var%"=="abc" (
    set variable=%1
    echo !variable!
)

SET /P代码注入导致安全问题?!

如果%Userinput%的输入为a==a format D:\ && echo,则cmd会看到:

if a==a
   do format D:\
   do echo ==y (

哪个...格式化你的D盘。添加像if "%var%"=="abc"这样的引号不会有帮助,因为用户可以转义引号并执行命令。

有关详细信息,请参阅here

SET /P替代

您可能需要考虑CHOICE单字母选择。它的命令语法是这样的:

choice /c choices /n /cs /t timeout /d default_choice /m prompt
  • / n隐藏选项列表,让/ m显示它自己的提示
  • / cs ==不区分大小写。

PATH变量

上面再次提到,PATH是Windows和其他程序使用的内部变量。错误设置可能会导致某些Windows功能或程序无法正常运行。

相反,请使用其他变量名称,例如programPath