当文件包含特定单词时移动文件吗?

时间:2019-01-17 11:25:59

标签: powershell

我目前正在尝试编写一个Powershell脚本,该脚本可以浏览给定目录中的所有文件,如果找到了特定的单词,则将它们移动到另一个目录中。

这是我目前拥有的:

$source = "Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test"
$hans = Get-ChildItem Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test -filter *.txt -recurse 
foreach($hans in $source) {
    select-string -list -pattern "24BHD" -path $source
}

现在我需要添加什么以使脚本移动包含字符串24BHD的文件?

我们将不胜感激!

3 个答案:

答案 0 :(得分:1)

您可以像这样使用-match比较:

$source = "Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test"
$dest = "C:\destination\directory"
$find = "24BHD"

foreach ($file in (Get-ChildItem "$source\*.txt" -Recurse)) {
    if ($file.Name -match $find) {
        Move-Item $file $dest
    }
}

答案 1 :(得分:1)

您非常接近,但是foreach语法没有按照您的想法做。

您需要使用foreach ($item in $hans),其中$hans是文件的集合,而$item代表“循环”期间数组中的每个“文件”。

$item变量名可以是您想要的任何东西,这只是我使用的示例)

FullName属性包含文件的完整路径,Select-String -Path需要此路径。

如果Move-Item返回匹配项,则使用Select-String

$source = 'Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test'
$destination = 'C:\Destination'
$pattern = '24BHD'

$hans = Get-ChildItem $source -filter *.txt -recurse 

foreach($item in $hans) {
    if (Select-String -list -pattern $pattern -path $item.fullname) {
        Move-Item -Path $item.fullname -Destination $destination
    }
}

答案 2 :(得分:0)

$source = 'Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test'   
$dest = 'c:\dest'
Get-ChildItem $source -filter *.txt -recurse | Select-String -List -Pattern "24BHD" | ForEach-Object {
    Move-Item $PSItem.Path -Destination $dest
}

编辑: 此示例更好,仅使用管道。 Get-ChildItem的输出通过管道传递到Select-String,该字符串将筛选出内容中包含“ 24BHD”的文件。匹配文件通过管道传输到Move-Item。在上面的示例中,我使用了Foreach-Object,因为我认为Move-Item无法处理Select-String的输出。这是不必要的,因为PowerShell的参数绑定可以完美地解决该问题。

还有一个警告:如果de文件夹结构$ source中存在重复的文件名,Move-Item将在$ dest文件夹中发生名称冲突

$source = 'Z:\Documents\16_Med._App\Aufträge\RuheEKG_24HBP_Skript\Ursprung_test'   
$dest = 'c:\dest'

Get-ChildItem $source -filter *.txt -recurse | 
  Select-String -List -Pattern "24BHD" |
  Move-Item -Destination $dest

有关参数绑定的更多信息,请参见:https://4sysops.com/archives/parameter-binding-in-the-powershell-pipeline/