我目前正在尝试编写一个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
的文件?
我们将不胜感激!
答案 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/