2010-10-13 83 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

相关问题