2016-05-17 51 views
0

我想讀取存儲在一系列.txt文件(格式相同的方式)中的值,作爲參數遵循另一個命令。如果IN(...)直接引用單個文本文件(最後一個空行除外),則一切正常。 結果:如何讀取文件內容作爲參數批處理文件

[1] = "TestValue11" 
[2] = "TestValue21" 
[3] = "TestValue31" 
[1] = "TestValut12" 
[2] = "TestValue22" 
[3] = "TestValue32" 
[1] = "" 
[2] = "" 
[3] = "" 

TestName.txt樣子:

TestValue11 TestValue21 TestValue31 
TestValut12 TestValue22 TestValue32 

但是,當我想設置的路徑TestName.txt放在另一個目錄比%〜DP0,讓我們說 「輸入」 ,只有filname被作爲第一個參數。循環不再進入文件。

我已經試過路徑放置IN ()如下:

IN ("%~dp0input\*.txt") 

IN ('DIR /A-D /B "%~dp0input\*.txt"') 

你能幫我做這個循環更加有用,從許多文件值可以readed ?

+1

空值是因爲循環結束後,腳本仍然通過'Process'命令。您可以在'Process'標籤之前添加一個'goto:eof'。 –

+0

另外,您不需要在'input \'路徑前引用'%〜dp0' ...只需像沒有'%dp0'那樣放置目錄路徑。用'@echo on'運行你的腳本,這樣你就可以看到真正發生了什麼。 –

+0

'%〜dp0'是批處理文件本身的父目錄;使用任何路徑,就像'IN(「\ path \ to \ your \ file.txt」)',因爲你已經指定了'usebackq'選項;注意''for/F'不支持通配符,如'*'和'?',所以如果指定'* .txt','for/F'會嘗試找到一個名爲'* .txt'的文件,這個文件找不到當然... – aschipfl

回答

1

有在你的代碼中的一些問題:

  1. 還有就是FOR /F循環後無GOTO :eof,讓您在循環結束後無意中落入:Process程序。
  2. 你應該把周圍的CALL :Process參數報價,因爲像SPACETAB,;=被視爲分隔符,否則字符。您可以在:Process子程序使用像%~1~改性劑等
  3. 後刪除這些引號由於文件路徑和名稱可以包含的空格,你應該將它們用引號""FOR /F將引用的字符串視爲文字字符串而不是文件名,除非您提供選項字符串usebackq
  4. FOR /F不支持通配符像*?,所以當你指定*.txtFOR /F試圖找到一個名爲*.txt文件,該文件無法找到,當然。爲了克服這個問題,你可以環繞標準的支持通配符的FOR循環。

這裏是固定的腳本:

@ECHO OFF 
FOR %%F IN ("\full\path\to\your\files\*.txt") DO (
    FOR /F "usebackq tokens=1,2,3 delims= " %%A IN ("%%~fF") DO CALL :Process "%%A" "%%B" "%%C" 
) 
GOTO :eof 

:Process 
ECHO [1] = "%~1" 
ECHO [2] = "%~2" 
ECHO [3] = "%~3" 
GOTO :eof 
+1

這真的很有幫助! 只有一個'%'符號丟失(在第一個FOR循環中) 我已經做出了類似的假設[閱讀此主題](http://serverfault.com/questions/508583/parse-all-text-files-in- a-folder-using-for-f-command),但是你的文章更快更重要!感謝:) – Marciniak

+0

不客氣!我剛糾正了'%'符號問題...... – aschipfl

1

沒有必要爲您的FOR/F給定的,你只是將再次回到一起把他們都分析出各個參數。

即使您想解析它們,也很難做到這一點,因爲FOR/F解析標記的方式與命令行解析器的工作方式完全不同。

下面列出的是你所需要的:

@echo off 
for /f delims^=^ eol^= %%A IN (TestName.txt) do call :Process %%A 
exit /b 

:Process 
echo [1] = "%1" 
echo [2] = "%2" 
echo [3] = "%3" 
exit /b 

奇數DELIMS和EOL語法有效地禁用這兩個選項,所以每個整條生產線將被保留。

正如其他人指出的那樣,FOR循環後需要EXIT/B(或GOTO:EOF)。

相關問題