将包含字符串的文件移动到与原始文件同名的子文件夹(PowerShell)

时间:2015-04-22 17:21:09

标签: string powershell move subdirectory

我使用的是PowerShell,这是我在这个问题上挣扎的两天。

在目录C:\ _dir_1中我有很多子文件夹(sub_1,sub_2,...,sub_n)。它们每个都包含几个文本文件。对于每个子文件夹i = 1,2,...,n,我想移动包含字符串" My-String"的文本文件。到目录C:\ dir_2 \ sub_i。

例如,如果路径C:\ dir1 \ sub_5中的文件X包含字符串" My-String",我想将其移动到位置C:\ dir_2 \ sub_5。目标文件夹已存在。

我尝试了以下代码的几处修改,但它不起作用:

Get-ChildItem "C:\dir_1" | Where-Object {$_.PSIsContainer -eq $True} | Foreach-Object {Get-ChildItem "C:\dir_1\$_" | Select-String -pattern "My-String" | group path | select name | %{Move-Item $_.name "C:\dir_2\$_"}}

所以,基本上,我尝试做的是:在dir_1中的foreach子文件夹,获取包含该字符串的文件,并将它们移动到dir_2中具有相同名称的子文件夹。我尝试了对该代码的几个小修改,但我不能解决我的错误。主要错误是" move-item:不支持给定的路径格式" ...任何帮助?

2 个答案:

答案 0 :(得分:6)

我觉得我可以做得更好,但这是我的第一个方法

hello </s1> </s0>

$dir1 = "C:\temp\data\folder1" $dir2 = "C:\temp\data\folder2" $results = Get-ChildItem $dir1 -recurse | Select-String -Pattern "asdf" $results | ForEach-Object{ $parentFolder = ($_.Path -split "\\")[-2] Move-Item -Path $_.Path -Destination ([io.path]::combine($dir2,$parentFolder)) } 可以为其管道输入获取文件路径。我们使用Select-String$dir1下的所有文件提供给子文件夹中的所有子文件。 -recurse将包含一个匹配对象数组。其中一个属性是匹配文件的路径。

对于所有这些$results,我们然后逐个浏览并从路径中提取父文件夹。然后将该文件夹与路径$results合并,以便将其移动到目标位置。

我们在这里有几个假设。如果需要,我们可以考虑一些。我会先提到一个我认识的问题。

  1. 您的文件夹中不应包含&#34; sub_1,sub_2,...,sub_n&#34;下的任何其他子文件夹。否则他们会尝试错误地移动。这可以通过更多的字符串操作来解决。尝试使用$dir2创建此警告时使代码简洁。

答案 1 :(得分:1)

这是一个单行,也可以做你想要的:

Get-ChildItem "C:\dir_1" | Where-Object {$_.PSIsContainer -eq $True} | ForEach-Object {$SubDirName = $_.Name;ForEach ($File in $(Get-ChildItem $_.FullName)){If ($File.Name -like "*My-String*"){Move-Item $File.FullName "C:\dir_2\$SubDirName"}}}

如果你想像Matt的回答那样突破它:

$ParentDir = Get-ChildItem "C:\dir_1" | Where-Object {$_.PSIsContainer -eq $True}
ForEach ($SubDir in $ParentDir){
    $SubDirName = $SubDir.Name
    ForEach ($File in $(Get-ChildItem $SubDir.FullName)){
        If ($File.Name -like "*My-String*"){
            Move-Item $File.FullName "C:\dir_2\$SubDirName"
        }
    }
}