2014-07-09 74 views
1

我需要能夠列出根文件夾中不包含包含字符串merged的文件的所有目錄。因此,例如,如果我從目錄C:\out運行腳本,我將獲得C:\out中與通配符merged不匹配的所有文件夾的列表。列出不包含通配符文件的所有目錄匹配

實施例:

樹:

-c:\out 
--c:\out\test123 
---sample.meta 
---sample_merged.meta 
--c:\out\test456 
---sample.meta 
---sample_merged.meta 
--c:\out\test789 
---sample.meta 
--c:\out\test013 
---sample.meta 

輸出:

test789 
test013 

回答

1

您可以使用Get-ChildItemWhere-Object,並Select-String

Get-ChildItem -Directory | 
Where-Object { -not (Get-ChildItem $_ -File -Recurse -Filter *merged*) } | 
Select-Object Name, LastWriteTime 

下面是什麼每一行做了解釋:

  1. 獲取所有目錄在當前目錄。

  2. 設置一個篩選器,通過每個目錄遞歸搜索包含字符串merged的文件名。如果沒有找到,只傳遞目錄。

  3. 獲取每個目錄的NameLastWriteTime屬性。

還要注意,你可以更簡潔,如果你想要寫:

gci -dir | ? { !(gci $_ -file -recur -filter *merged*) } | select name, *w*time 
+0

這是完美的!我還可以列出標籤名稱旁邊的最後修改日期嗎? –

0

拉一個目錄用於目標列表,然後過濾針對靶的列表文件夾不包含您的fi文件過濾。

$BaseDir = "C:\out" 
$FilterFile = "sample_merged.meta" 
GCI $BaseDir -Directory | ?{!(GCI $_.FullName | Select -Expand Name) -Contains $FilterFile}|Select -Expand Name 

這應該給你想要的輸出。將最後一個Name更改爲FullName以獲取整個路徑,而不僅僅是文件夾名稱。

0

對於批量版本

@echo off 

    setlocal enableextensions 
    for /d %%a in ("c:\out\*") do (
     dir /b /a-d "%%~fa\*merged*" >nul 2>nul || echo %%~ta %%~nxa 
    ) 

簡單迭代的文件夾內c:\out,併爲每個他們一個dir命令爲*merged*文件被執行。如果該命令失敗,則將時間戳和文件夾名稱回傳給控制檯。

相關問題