2017-09-12 85 views
1

在這裏使用Server 2016進行簡單的批處理文件編程(現在)。使用「=&rem」通過輸入變量批量操作字符串。

我有我認爲的一個簡單的問題,只是我現在看不到一個可行的解決方案。我將限制我的請求到測試場景,以保持簡單。我試圖做的是從右邊修剪一個字符串,直到以「_%year% - 」格式打到當前年份,其中年份來自其他地方的變量,但在我的示例中設置爲靜態。我碰到問題的地方是指代碼中的一個變量。

這是一個工作示例不使用在REM行的變量,並給出所需的輸出「Machined_Cam-2286:」

@ECHO OFF 
SETLOCAL DisableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set testString=%testString:_2017-=&rem.% 

echo %testString% 

pause 

你可以看到「_2017-」硬編碼在第十行。我所期待的在REM線特別純粹的邏輯意義的事:

set testString=%testString:%yearModified%=&rem.% 

由於存在這些命令修改後的TestString在線的方式,使得它難以注入變量進去。我嘗試了一個巨大的轉義和擴展設置組合來讓變量取得迄今爲止的成功。我也嘗試作爲一個字符串,以「打造」的命令,並試圖把它和管道輸出到一個變量:

@ECHO OFF 
SETLOCAL DisableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set "callCMD=%%testString:%yearModified%=^&rem.%%" 

call %callCMD% > %testString% 

echo %testString% 

pause 

這似乎是這樣一個簡單的問題,但我缺乏下字符串操作的理解DOS很明顯。按照現狀,腳本的其餘部分與硬編碼的「_2017-」完美搭配。消除這種維護是很好的。

任何幫助或方向表示讚賞。

謝謝。

+1

爲什麼你明確禁用延遲擴展? – Stephan

+0

作爲一種習慣,我通常禁用它,只有在需要保持語法通用時才啓用/禁用它。桌面上的任何選項都可以解決這個問題,所以我明白爲什麼要明確說明這可能看起來很奇怪。 – GHTurbines

回答

1

我可以告訴你分裂的另一種方法。用適當的分隔符替換您的「分隔符串」,並使用for進行分隔(for使用單字母分隔符)。啓用延遲擴展有助於但不是必需的。當你明確地禁用它(你可以有你的理由),我會告訴你們:

@echo off 
set "TestString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "CutHere=_2017" 

setlocal enabledelayedexpansion 
for /f "delims=§" %%a in ("!TestString:%CutHere%=§!") do set Result=%%~a 
echo enabled: %Result% 
endlocal 

setlocal disabledelayedexpansion 
for /f "delims=§" %%a in ('call echo "%%TestString:%CutHere%=§%%"') do set Result=%%~a 
echo disabled: %Result% 
endlocal 

只要確保你使用分隔符(§這裏)是肯定不會在你的字符串(S )。

+0

謝謝!這似乎是一個更強大的解決方案,可以在不使用DelayedExpansion的情況下工作,並且操作本身也是單線解決方案,用於增加內容(有些人更喜歡可讀性和其他簡潔性)。 – GHTurbines

+0

不錯的把戲+1。沒有檢查CutHere是否存在,可以使用'tokens = 1,2'和'if'%% b「neq」「(設置Result = %% a)else exit/b 1'來完成 – LotPings

+0

@LotPings :如果沒有分隔符,我希望它會返回整個字符串,但是,其他人可能會有其他期望/需求。 – Stephan

0

你正在試圖控制你所說的採用可變

嘗試使用一個臨時文件,而不是內容 -

echo %%testString:%yearModified%=^&rem.%%" > temp.bat 
call temp.bat > %testString% 
+0

謝謝!我能夠通過一些修改來使用您的語法,以便從臨時批處理文件中處理命令。我將不得不記住未來的工作方式。 – GHTurbines

0

NEED延遲擴展這種類型的操作,所以enabe它。

  • 我建議首先得到的字符串
  • 的剩餘部分,並從原來的字符串中刪除這一點。

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

set "testString=Machined_Cam-2286_2017-09-08.slddrw - SOLIDWORKS" 
set "systemYear=2017" 
set "yearModified=_%systemYear%-" 

echo "%testString%" | find "%yearModified%" >NUL || goto :EOF 

set tempString=!testString:*%yearModified%=! 
set testString=!testString:%yearModified%%tempstring%=! 

echo %testString% 

pause 

輸出示例:

Machined_Cam-2286 
+0

謝謝!這工作很好,切換DelayedExpansion。我會將此語法添加到我的工具箱中。 – GHTurbines