2014-11-23 369 views
2

我有一些代碼,我想用FOR循環來處理一組文件。 作爲處理文件的一部分,有一個FOR /F循環讀取它並根據文件名將數據追加到其他文件。如何在批處理文件中使用嵌套FOR循環

爲了能夠設置輸出文件名,我設置了延遲變量擴展集。

這是代碼應該是什麼樣子,因爲我原本打算它是:

setlocal enabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    set POI=%%~f 
    set POI=!JbPOI:DataFolder\=! 
    set POI=!JbPOI:.Ext=! 
    for /f "tokens=1,2,3 delims=," %%a in ("%%~f") do (
     set CX=%%a 
     set CY=%%b 
     set FN=%%c 
     echo !FN!,9,!CX!,!CY! >> "DataFolder\!POI!.tmp" 
    ) 
) 
endlocal 

此代碼不起作用,因爲變量%%a%%b%%c永遠不會收到一個值,%%a總是有與%%f的值相同。

我已閱讀了一些關於此問題的文章,但無法從他們的工作中提取解決方案。

我已經試過幾件事,沒有到目前爲止工作...

  • 添加一個虛擬外環創建變量%%a通過%%j明確
  • FOR取出循環,並使它成爲子程序
  • 內部FOR環取出並使其成爲一個單獨的批處理文件

任何人都可以請te讓我知道這可以 - 或必須 - 解決?

+1

我想說最簡單的解決方案是安裝Python併爲它編寫一個小Python腳本。或者除了MS批處理之外還有其他任何語言 – ThiefMaster 2014-11-23 15:45:09

+0

是否要讀取文件'%%〜f'的內容或將其名稱用作字符串。因爲現在您將它用作字符串。 – npocmaka 2014-11-23 15:54:52

+0

文件%% f將被讀取......如果以這種方式將它視爲字符串:這有意義地解釋了爲什麼%% a始終與%% f具有相同的值。我將要做更多的測試... – 2014-11-23 19:05:59

回答

3
setlocal enabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    set POI=%%~f 
    set POI=!JbPOI:DataFolder\=! 
    set POI=!JbPOI:.Ext=! 
    for /f "useback tokens=1,2,3 delims=," %%a in ("%%~f") do (
     set CX=%%a 
     set CY=%%b 
     set FN=%%c 
     echo !FN!,9,!CX!,!CY! >> "DataFolder\!POI!.tmp" 
    ) 
) 
endlocal 

我不確定您是否想讀取文件"%%~f",但我認爲這是您需要的。

+0

不應該'useback'是'usebackq'? – 2016-03-29 16:15:41

+0

@LưuVĩnhPhúc - 他們都工作 – npocmaka 2016-03-29 16:56:42

+0

我剛剛意識到它是無證的解決方案http://ss64.com/nt/for_f.html – 2016-03-29 16:58:29

1

對不起,但對於發佈的代碼,我不認爲需要延遲擴展。所有需要的數據是直接從for替換參數

setlocal enableextensions disabledelayedexpansion 
for %%f in (DataFolder\*.Ext) do (
    (
    for /f "usebackq tokens=1-3 delims=," %%a in ("%%~f") do echo(%%c,9,%%a,%%b 
) > "DataFolder\%%~nf.tmp" 
) 
endlocal 

檢索如果實際代碼包含的東西就不貼了,也許從npocmaka答案將更好地適應問題。

+0

正如你所看到的,輸出文件名的一部分來源於%% f文件姓名,但不完全......有些人物被剝離。 – 2014-11-23 23:35:59

+0

@JaapBregman,是的,路徑和擴展名。 '%%〜nf'將只返回沒有路徑和擴展名的文件名。 – 2014-11-24 05:53:27

+0

感謝提示! – 2014-11-25 11:09:07