我目前正在尝试编写一个Powershell脚本,该脚本可以查看给定目录中的所有文件,并在找到特定单词时将它们移动到其他目录。
这是我目前拥有的:
$source = "Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_test"
$hans = Get-ChildItem Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_test -filter *.txt -recurse
foreach($hans in $source) {
select-string -list -pattern "24BHD" -path $source
}
现在我需要添加什么才能使脚本移动包含字符串的文件24BHD
?
所有的帮助将不胜感激!
$source = 'Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_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"的文件。匹配的文件通过管道传输到移动项。在上面的例子中,我使用了Foreach-Object,因为我认为Move-Item无法处理Select-String的输出。这是不必要的,因为PowerShell的参数绑定可以完美地解决这个问题。
仍然有一个警告:如果 de 文件夹结构中存在重复的文件名 $source,Move-Item 将在 $dest 文件夹中遇到名称冲突
$source = 'Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_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/
你非常接近,但foreach
语法并没有按照你的想法做。
您需要使用 foreach ($item in $hans)
,其中$hans
是文件的集合,$item
表示"循环"期间数组中的每个"文件"。
($item
变量名称可以是您想要的任何内容,这只是我使用的示例)
FullName
属性包含文件的完整路径,这是 Select-String -Path
所需的。
然后使用 Move-Item
如果返回匹配项Select-String
:
$source = 'Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_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
}
}
如下所示的-match
比较:
$source = "Z:Documents16_Med._AppAufträgeRuheEKG_24HBP_SkriptUrsprung_test"
$dest = "C:destinationdirectory"
$find = "24BHD"
foreach ($file in (Get-ChildItem "$source*.txt" -Recurse)) {
if ($file.Name -match $find) {
Move-Item $file $dest
}
}