2010-01-16 41 views
1

這是一個似乎變得更加複雜的需求之一,每當我找到需要「解決辦法」的Windows/cmd shell破解時。基本上......我需要遍歷DOS外殼FOR循環中的特定文件夾列表。這是我想出的循環:FOR/F循環中的Spurious'system cmd.exe'

echo^[start for test] 
for /F "usebackq " %%f IN (`dir /b /adh "w:\sandbox\tmp\"`) DO (
    echo^ do with file: %%f 
    rem <do something> 
) 
echo^[for test done] 

主要需要遍歷源文件夾中的隱藏目錄(此處爲sandbox \ tmp)。

結果既令人驚訝又令人沮喪。這是在控制檯命令行上使用此FOR指令的結果。

W:..> for /F "usebackq " %f 
       IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo^folder = %f 
File Not Found        <1> 
    folder = C:\WINDOWS\system32\cmd.exe  <2> 
    folder = any        <4> 
    folder = hidden-folder-01     <3> 
    folder = hidden-folder-02     <3> 
    folder = morph        <4> 
    folder = practice-northwind     <4> 

其中列出了五個文件夾。大!和一個cmd.exe在標籤:< >和一個神祕的標籤:< >。我應該解釋我認爲的DIR開關。

  • /b .......裸格式,只是文件/文件夾的名稱。
  • /a dh .....隱藏和目錄,盡力詳盡地嘗試 - 沒有工作。
    /一個HD
  • /一個d ......與目錄屬性(文件夾)的項目。
  • /a h ......隱藏文件/文件夾(貌似)。

我已經標記了輸出,這是我迄今爲止所做的工作。

  1. 'File Not Found'.. .. .. .. .. ..我不知道。我發現「文件未找到」。 < >是/ah交換機的人造物。當我只是說:
    IN(dir /b /adh "w:\sandbox\tmp\"
  2. C:\ WINDOWS \ system32 ** cmd.exe ** .. ..虛假迭代器(%% f);此錯誤僅與FOR/F命令版本一起顯示。我想查找隱藏的目錄,並且文件集列表不會返回隱藏文件(d'oh)。所以,迄今爲止我卡與有usebackq版本的FOR/F
  3. 隱藏文件夾..。 .. .. .. .. .. ..這些文件夾的預期輸出 _。
  4. 目錄文件夾。 .. .. .. ..這些文件是虛假的結果,而不是想要的。

從CMD線版本(或來自樣品的DOS腳本)預期的結果僅僅是< >項。

W:..> for /F "usebackq " %f 
       IN (`dir /b /adh "w:\sandbox\tmp\"`) DO echo^folder = %f 
    folder = hidden-folder-01     <3> 
    folder = hidden-folder-02     <3> 

不幸的是,我'也'可以得到目標文件夾中的任何文件。我認爲這又與HIDDEN開關(/ ah)有關。

如何只列出設置目錄中的隱藏文件夾(不是文件);並像FOR命令一樣迭代列表?

在此先感謝/將

回答

2

在批處理文件dir /b /a dh "w:\sandbox\tmp\"應該是dir /b /adh "w:\sandbox\tmp\"與/ a和DH之間沒有空格。用空格dir命令將dh解釋爲一個目錄或文件paremer,並導致文件未找到錯誤。

當您從命令行運行時,您正在使用與dir命令dir /b /ah /ad "w:\sandbox\tmp\"不同的參數,因此您將獲得不同的輸出。以/ ah和/ ad作爲單獨的參數,dir似乎解釋了它應該顯示的東西是目錄或隱藏文件,而/ adh將顯示目錄和隱藏的東西。

此外,您不需要在所有行上都有@。只是,但在文件的頂部關閉@echo,這將禁用整個批處理文件的命令回顯。

+0

嗨shf301, 感謝您的意見。我很早就發現了這些觀點。不幸的是,這些變化並沒有幫助解決問題。我從/ aX命令中取出了空格。 dir/ah ....不顯示隱藏的文件或文件夾。 dir/ad ....顯示目錄 dir/adh和dir/ahd ....顯示絕對沒有文件或目錄。 在FOR/F循環中的所有情況下 - 我在列表中得到一個僞造的$ system/cmd.exe。 我的領導@是故意的,我發現它在15年前調試腳本時幫助我。 /w。 – will

1

您應該使用

for /F "usebackq delims=*" %f IN (`"dir /b /adh "%1" 2>NUL"`) DO @echo. folder = "%f" 

做到這一點。

2>NUL 

將確保誤差通道(例如文件未找到)未顯示的並指出NULL(NUL)

delims=* 

將確保該腳本也將工作,如果文件名有空格,因爲文件名不能有「*」,我們會發現它們全部!

我希望這對你有效,它爲我工作。

我想有反饋,如果事情在你身邊的變化,如果你不使用%F,但使用%一個,我有一個想法,爲什麼WOU得到下面一行在輸出

folder = C:\WINDOWS\system32\cmd.exe  <2> 

迎接 PCFreak

+0

原諒我,但是這難道不是在隱藏問題嗎?這些天我使用帶有循環等的CALL:標籤結構。從這樣的很多頭痛中拯救了我。唉,我只是認爲CMD的語法是...... – will