2016-12-29 39 views
0

我試圖從包含冒號和感嘆號的文件中讀取一行。當我回應該行時,它只顯示冒號後的所有內容。我需要保留enabledelayedexpansion以獲得更多高級代碼,我將在do循環中進行操作。但是現在我只想正確迴應。 任何幫助,將不勝感激!批處理:從具有冒號和感嘆號的文件中讀取一行

文件會這樣說:

! 12345 APX: 6.32

代碼我想是:

setlocal EnableDelayedExpansion 
cd C:\Users\jwagh\Desktop\ 
for /f "usebackq delims=" %%a in (test.txt) DO (
setlocal DisableDelayedExpansion 
echo %%a 
set line=%%a 
set example=%line:~0,-1% 
echo %example% 
) 
+0

在'%% a'擴展期間禁用延遲擴展,並且只在您確實需要時才啓用它... – aschipfl

+0

我試圖在do循環內重新啓用它,但它不起作用。 – Wajo357

+0

「這不起作用」不是一個相當精確的描述,是嗎?也許你應該多發一些代碼,這樣可能會更容易幫助你。一般來說,你需要考慮'setlocal' /'endlocal'的環境本地化,你需要知道這些塊的嵌套級別是有限的,因此當你有一個'setlocal'時,你需要在循環中有一個'endlocal' '那裏... – aschipfl

回答

1

可能禁用delayedexpansion是唯一可行的解​​決辦法,但根據您的數據,設置delims!將設置%%a到整條生產線,減去最初的!(假設顯然只有一個!-已知長度的序列並且它總是引導該行)

for /f "usebackq delims=!" %%a in (%FamilyFile%) DO echo ^^!%%a 
+0

這就是我最終做的。謝謝! – Wajo357

1

唯一防彈溶液是%%a擴張期間禁用delayed expansion,並使其能只有當實際需要它。例如,像這樣:

setlocal DisableDelayedExpansion 
for /F "usebackq delims=" %%a in (%File%) do (
    set "Item=%%a" 
    setlocal EnableDelayedExpansion 
    echo(!Item:,-1! 
    endlocal 
) 

由於通過setlocal/endlocal塊創建本地化的環境中的嵌套方面是有限的,你也需要把endlocal一個循環中。在endlocal之後,自最新的setlocal以來所有環境變化都會丟失。


但現在完全不同的東西(有關問題的revision 3):
我認爲%File%持有引用文件路徑/文件名,這是因爲usebackq選項。
讓我建議不包括在變量值引號,使用的語法如下:

set "File=D:\Data\file.ext" & rem // (particularly note the position of the opening quote) 

參考this post瞭解爲什麼這是更好的。