2017-03-08 18 views
2

我想在Windows批處理編程中做一些子字符串,但它看起來不像Linux腳本編寫那麼容易。在Windows批處理編程中使用變量

這是我的代碼片段。

set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=%ENV_STRING:~%START_INDEX%,%END_INDEX%% 

START_INDEX和END_INDEX將根據將由用戶提供的ENV_STRING而改變。我正在使用START_INDEX和END_INDEX的靜態整數來表示使用這些變量。我只想從ENV_STRING中提取hello.alt.dir的值。

當我打印出newStr時,它不會對字符串進行子串處理。

有人能指出哪一部分是錯的嗎?

謝謝。

+0

問題不明,請顯示期望的結果。 – jfatal

+0

我想從ENV_STRING中只提取'C:\ Works \ download',它是'-Dhello.alt.dir'的值。 – user826323

+1

使用'SET newStr =!ENV_STRING:〜%START_INDEX%,%END_INDEX%!'帶延時擴展或'CALL SET newStr = %% ENV_STRING:〜%START_INDEX%,%END_INDEX %%%'。我建議你閱讀[這個答案](http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990)這解釋了這種管理,但主題不同。 – Aacini

回答

2

可以使用以下代碼:

@echo off 
set "ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download - Dhello.type=DDDDD" 
set "START_INDEX=34" 
set "END_INDEX=51" 
setlocal EnableDelayedExpansion 
set "newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%!" 
endlocal & set "newStr=%newStr%" 

不可能引用一個環境變量的值等START_INDEXEND_INDEX可變基準內。 Windows命令解釋程序無法解釋變量引用。

解決方案使用延遲擴展應用替換的變量,並立即擴展開始和結束索引引用,如上面的代碼所示。

但命令SETLOCAL創建當前環境變量的副本,因此環境變量命令ENDLOCAL放棄當前的環境變量列表,並恢復先前的變量列表之後再newStr就不會存在。解決方案是使用ENDLOCALSET在一行上即時變量擴展。

順便說一句:字符串拆分通常使用for /F在Windows批處理腳本中完成。

2

嘗試這樣的:

setlocal enableDelayedExpansion 
set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%! 
echo -%newStr%- 

隨着包圍!延遲擴展和變量被執行時,它的表達將被評估(即延遲)。儘管%中包含的變量將被立即替換,因此您可以避免碰撞%