2010-10-13 84 views
5

是否可以定義一個文件名數組(所有文件位於不同文件夾中),然後在循環中刪除它們或執行其他操作?使用Powershell刪除數組中定義的文件

其實我需要用mklink創建一些符號鏈接到一個文件,把這些鏈接放在不同的文件夾中,如果有的話替換舊的鏈接。

回答

6

刪除的文件名的陣列是簡單的:

Remove-Item foo.txt,c:\temp\bar.txt,baz\baz.txt 

或經由一個變量:

$files = 'foo.txt','c:\temp\bar.txt','baz\baz.txt' 
Remove-Item $files 

然後基於在不同的文件夾中的所有文件:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r | Where {!$_.PSIsContainer} | Remove-Item -WhatIf 

卸下-WhatIf做實際的刪除。

如果要刪除具有特定名稱的文件,可以使用Get-ChildItem上的-Filter參數。這將是表現最好的辦法:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r -filter foo.bak | Remove-Item -WhatIf 

如果名字需要更復雜的匹配,那麼你可以使用正則表達式在where腳本塊如:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r | Where {$_.Name -match 'f\d+.bak$'} | 
          Remove-Item -WhatIf 
+0

什麼是PSIsContainer? – Agzam 2010-10-13 17:56:13

+0

你能告訴我如何刪除在變量中定義的所有文件夾中給定文件名的文件? – Agzam 2010-10-13 18:04:57

+1

$ PSIsContainer是PowerShell添加的一個屬性,用於指示「ChildItem」是否爲容器(目錄)或不是(文件)。請注意,這個概念獨立於實際的提供者(文件系統,證書,wsman等)。 – 2010-10-14 00:16:47

1

這樣的事情應該工作: 能現在「t檢驗,對不起

$filenames = @('filename1.txt', 'filename2.txt', 'filename3.txt') 

foreach($file in $filenames) 
{ 
    #GCI recursive to find all instances of this filename 
    $filesToDelete = Get-ChildItem -R | where {$_.Name -eq $file} 

    foreach($f in $filesToDelete) 
    { 
     #delete the file that matches, etc. here 
     # just using Write-Host to echo out the name for now 
     Write-Host $f.Name 
    } 

} 

與大多數PowerShell中,你真的可以壓縮這一點,但希望編輯以便解釋。

您可以擴展此以符合您的需求。例如,如果您需要包含單詞「刪除」的所有文件,則可以執行gci |其中{$ _。Name-like「$ file」}

+0

您的.net部分會產生不需要的輸出('Add')方法,該方法應該被丟棄。試着運行'$ filelist = New-Object System.Collections.ArrayList; $ filelist.add( 「filename1.txt」)'。 – stej 2010-10-14 06:26:03

+0

昨天沒有時間測試它。現在刪除。 – 2010-10-14 15:31:04

相關問題