我有一個file.txt,其中包含安裝在我的機器上的oracles的路徑。 從註冊表 例如該文件包含:通過批處理文件從文件讀取
ORACLE_HOME REG_SZ C:\oracle\product\11.2.0\dbhome_1
ORACLE_HOME REG_SZ C:\oracle\product\11.2.0\dbhome_2
我通過我的批處理文件插入神諭到一個列表或類似列表中的所有路徑想要的。 如何在批處理文件中執行此操作? 謝謝!
我有一個file.txt,其中包含安裝在我的機器上的oracles的路徑。 從註冊表 例如該文件包含:通過批處理文件從文件讀取
ORACLE_HOME REG_SZ C:\oracle\product\11.2.0\dbhome_1
ORACLE_HOME REG_SZ C:\oracle\product\11.2.0\dbhome_2
我通過我的批處理文件插入神諭到一個列表或類似列表中的所有路徑想要的。 如何在批處理文件中執行此操作? 謝謝!
假設你想在內存中的值「列表」,而不是在一個文件中:
我想大多數人都喜歡的,可以通過索引值來訪問值的「陣列」。 (注 - 批處理沒有正式的數組,但可以模擬它們)。
只要沒有主路徑包含!
,下面的簡單代碼就很有用。如果%%B
包含!
並且啓用延遲擴展,則擴展%%B
將被損壞。
@echo off
setlocal enableDelayedExpansion
:: Read the file and create an "array" of home paths
:: This will fail if any of the paths contain !
set /a cnt=0
for /f "usebackq tokens=2*" %%A in ("file.txt") do (
set /a cnt+=1
set "home.!cnt!=%%B"
)
:: Access the "array" members
for /l %%N in (1 1 %cnt%) do echo !home.%%N!
您可能可以在很多環境中運行上述代碼多年,並且永遠不會遇到問題。但是某個地方可能包含!
在Oracle主路徑中。有許多策略可以解決上述問題以處理!
。以下三個選項:
選項1 - 的代碼量最少,但最慢由於CALL
@echo off
setlocal disableDelayedExpansion
:: Read the file and create an "array" of home paths
:: This will safely process all paths, regardless of value
set /a cnt=0
for /f "usebackq tokens=2*" %%A in ("file.txt") do (
set /a cnt+=1
call set "home.%%cnt%%=%%B"
)
:: Access the "array"
setlocal enableDelayedExpansion
for /l %%N in (1 1 %cnt%) do echo !home.%%N!
選項2 - 使用FINDSTR計數的行的一個有趣的和有效的方法。
@echo off
setlocal disableDelayedExpansion
:: Read the file and create an "array" of home paths
:: This will safely process all paths, regardless of value
set /a cnt=0
for /f "tokens=1,3* delims=: " %%A in ('findstr /n "^" "file.txt"') do (
set "home.%%A=%%C"
set "cnt=%%A"
)
:: Access the "array" members
setlocal enableDelayedExpansion
for /l %%N in (1 1 %cnt%) do echo !home.%%N!
選項3 - 使用的是延遲擴展反覆的有效方法,但是最代碼
@echo off
setlocal disableDelayedExpansion
:: Read the file and create an "array" of home paths
:: This will safely process all paths, regardless of value
set /a cnt=0
for /f "usebackq tokens=2*" %%A in ("file.txt") do (
set /a cnt+=1
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
set "home.%%N=%%B"
)
)
:: Access the "array"
setlocal enableDelayedExpansion
for /l %%N in (1 1 %cnt%) do echo !home.%%N!
另外,也可以具有在單個變量的家用路徑列表。每條路徑都應該用引號括起來。路徑可以用空格,逗號,分號,平等或製表符分隔。我選擇了空間。
該列表的大小是有限的,因爲批處理環境變量的最大大小是〜8191字節。由於CALL,此解決方案也相對較慢。這些問題都不可能成爲現實世界中的問題。
@echo off
setlocal disableDelayedExpansion
:: Read the file and create a space delimited list of quoted home paths
:: This will safely process all paths, regardless of value
for /f "usebackq tokens=2*" %%A in ("file.txt") do (call set list=%%list%% "%%~B")
:: optional - remove leading space
(set list=%list:~1%)
:: Display the list
echo list=%list%
:: Access the list members
for %%F in (%list%) do echo %%~F
非常感謝!你能解釋我最後一個選項嗎我不知道什麼是usebackq,〜B等,如果你還可以選擇以前的選項。在批處理文件中是新的,它會幫助我..謝謝!!! – zipi
@zipi - USEBACKQ不是真的需要你的情況,但我用它來處理包含空格的文件名。通常引用IN()子句被視爲一個字符串,USEBACKQ選項將帶引號的IN()子句作爲文件名,在命令提示符下鍵入HELP FOR來獲取更多信息。 。一般來說,你可以通過鍵入'HELP commandName'或'commandName /?'來獲得任何命令的幫助。 – dbenham
maby你會知道的。我使用你的soloution,現在我需要幫助的東西在那裏:我使用:for %% F在(%list%)做,我想驗證每個路徑中是否有文件名ss.tns我嘗試:爲%% F在(%list%)做 如果存在%%〜F \ bin \ ss.tns( 回聲成功 )但它不適用於我 – zipi
for /f "tokens=3 delims= " %%a in (file.txt) do echo %%a >>paths.txt
我認爲OP希望在內存中存儲數據,而不是文件。此外,如果路徑包含空間,則會以書面形式失敗。通過使用''tokens = 2 *'和'%% b'很容易修復。 – dbenham
是否要將它們添加到環境變量列表中? – anishsane
是的,我想最終進入每條路徑並做點什麼 – zipi