iT邦幫忙

0

BAT 編寫求助 (變數合併) (已解決)

各位先進不好意思,小弟在編寫BAT檔時腦袋有點轉不過去。

資料夾結構:

0000_XXXX1.txt
0000_XXXX2.txt
0001_XXXX1.txt

需求:

輸入字串查找資料夾裡是否有相同檔案,若一筆的情況下直接執行若多筆的情況下則可輸入選擇。

請輸入編號:0000
----list----
1.0000_XXXX1.txt
2.0000_XXXX2.txt

請輸入執行編號:2

執行2

問題:

輸入,查找,執行都可以但多筆的情況下,小弟的做法是直接用COUNT的方式宣告變數然後將檔案名稱丟進去,之後在輸入數字然後執行。

fcount為計數
f為變數
此時fcount為1
f!fcount!為f1
把檔案名稱丟進f1
fcount進1
f!fcount!為f2
把檔案名稱丟進f2

直接%f1%或%f2%可正常打開檔案
%f1% echo輸出內容為 0000_XXXX1.txt

但希望是%fb%,若f為固定文字,b最後使用者輸入數宇(例 input 1,變數b),然後打開指定檔案

試%f!fcount!%無法打開檔案<--這裡小弟腦袋轉不過去,請先進幫幫忙啊!!!

@echo off&setlocal enabledelayedexpansion
set basepath=D:\ 
set /a fcount=0


set /p a=input:

for /l %%a in (0,1,10) do (
    set /a b+=1
    if not "!a:~%%a,1!"=="" (
        ECHO "!a:~%%a,1!"==""
	set c=!b!
    )
)


if %c% == 4 (
	ECHO ■====リスト====■
 	For  /F  %%f in ('dir/b %a%*') do (
 	set /a fcount+=1
        echo !fcount!.%%f
	set f!fcount!=%%f 
 	) 
) else (
 	set /p=error 
)

%f!fcount!% <--如何合併兩個變數為一個變數?

小成前輩的解答:

@echo off&setlocal enabledelayedexpansion
set basepath=D:\ 
set /a fcount=0


set /p a=input:

for /l %%a in (0,1,10) do (
    set /a b+=1
    if not "!a:~%%a,1!"=="" (
        ECHO "!a:~%%a,1!"==""
	set c=!b!
    )
)

if %c% == 4 (
For /F %%n in ('dir/b %a%*') do (
set /a fcount+=1
echo !fcount!.%%n
set f!fcount!=%%n 
) 
) else (
set /p=error 
)

set /p u=input: 
!f%u%! <--喵的,原來是要跑!在跑%
看更多先前的討論...收起先前的討論...
小成 iT邦高手 10 級 ‧ 2019-07-03 16:27:55 檢舉
.
narumi iT邦新手 5 級 ‧ 2019-07-03 16:36:33 檢舉
前輩,您提供的方式小弟試過,他好像直輸出f2
但要讓變數生效好像要變成%f2%才會去開檔案。
小成 iT邦高手 10 級 ‧ 2019-07-03 18:44:51 檢舉
對,不好意思我早先沒看懂題目
你參考一下這個
https://stackoverflow.com/questions/12150065/dos-batch-nested-variable-name-using-enabledelayedexpansion
narumi iT邦新手 5 級 ‧ 2019-07-03 18:59:57 檢舉
大師大師,小弟查看了一下,感覺不是小弟要的。
簡單來說,小弟想實現的是,f%b%,b為使用者輸入,則希望把f 跟 %b%合併成一個變數為%fb%這樣.
變數資料類型,先統一轉換成字串類型,再合併字串資料就可以了。
narumi iT邦新手 5 級 ‧ 2019-07-03 19:31:06 檢舉
合併字串試過,但是無法變成%變數%.(汗
小成 iT邦高手 10 級 ‧ 2019-07-03 19:47:41 檢舉
對阿,那篇文章沒錯阿
用你的CODE我改了一下,我列最下面有改的部分,你看一下
if %c% == 4 (
For /F %%n in ('dir/b %a%*') do (
set /a fcount+=1
echo !fcount!.%%n
set f!fcount!=%%n
)
) else (
set /p=error
)

set /p u=input:
echo !f%u%!
小成 iT邦高手 10 級 ‧ 2019-07-03 19:50:07 檢舉
簡單說,!是延遲變數,會先跑%再跑!,你反了
narumi iT邦新手 5 級 ‧ 2019-07-03 20:01:19 檢舉
!!!!
narumi iT邦新手 5 級 ‧ 2019-07-03 20:04:07 檢舉
見鬼!!!!原來我跑反了!!!!
感謝小成大大的幫忙!!!
小成 iT邦高手 10 級 ‧ 2019-07-04 09:11:31 檢舉
上面那篇文章我只看CODE沒看敘述啦XD,所以可能這樣有點誤解

尚未有邦友回答

立即登入回答