2015-04-22 160 views
3

我正在使用PowerShell,并且我在这个问题上苦苦挣扎了两天。将包含字符串的文件移动到与原始文件夹名称相同的子文件夹(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包含字符串“我的字符串”,我想将其移动到位置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中具有相同名称的子文件夹中。我尝试了几次对该代码的小修改,但我无法解决我的错误。主要的错误是“移动项目:给定的路径格式不支持”...任何帮助?

+0

要尝试和意译:您正在查找包含某个字符串的dir_1 \ Sub_X中的文件。对于找到的所有文件,将它们移动到dir_2 \ SUB_X中?其中sub_X是同一个文件夹,它在dir_1里面......我想我明白了。 – Matt

+0

正确,你得到它:) –

回答

5

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

$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可以利用文件路径的管道输入。我们使用-recurse将所有$dir1下的文件送到子文件夹中。 $results将包含匹配对象的数组。其中一个属性是匹配文件的路径。

以上所有这些$results我们然后通过每个并从路径中提取父文件夹。然后将该文件夹与路径$dir2合并,以便将其移动到目标位置。

我们在这里有几个假设。有些我们可以说明是否需要。我会提到我所知道的可能是第一个问题。

  1. 您的文件夹不应该在“sub_1,sub_2,...,sub_n”下面有任何其他子文件夹,否则他们会尝试错误地移动。这可以通过更多的字符串操作来解决。为了使代码简洁,使用-Recurse创建了此警告。
+0

马特,你是天才! :D它的工作:) 非常感谢你!我想upvote你的答案,但我仍然不能(我是newbe:P) 编辑:的确,没有其他子文件夹下“sub_1,sub2,...,sub_n”。所以它非常完美 –

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"}}} 

如果你想看到它打破了像马特的答案:

$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" 
     } 
    } 
} 
+1

你几乎可以将所有的代码写成一行代码! – Matt

相关问题