2017-08-28 39 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