2017-08-28 36 views
0

我正在尝试创建交互式bat文件,该文件询问文件夹的详细信息,它可以采用userchoice,但之后无法设置useri.e提供的文件夹路径。它需要的路径,直到桌面only.Below是我的代码相同:set/p未按预期工作

@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

使用顶部栏中的“搜索”工具来查找对“延迟扩展”的引用 - 它是#1 FAQ。 – Magoo

+1

设置和使用(代码块)内的变量时,您需要[延迟扩展](http://s64.com/nt/delayedexpansion.html)。 – LotPings

+0

LotPings可以请你提供代码吗? –

回答

0

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

此外,斯蒂芬& 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:\ && echocmd认为:

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隐藏的选项,让/米列表中显示它自己的提示
  • /CS ==不区分大小写的。

PATH可变

上述同样提到

PATH是由Windows和其他程序使用的内部变量。错误设置可能会导致某些Windows功能或程序无法正常工作。

而是使用另一个变量名称,如programPath