我使用的是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:不支持给定的路径格式" ...任何帮助?
答案 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
合并,以便将其移动到目标位置。
我们在这里有几个假设。如果需要,我们可以考虑一些。我会先提到一个我认识的问题。
$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"
}
}
}