【问题标题】:PowerShell Find Matching Folders and then move from src to destinationPowerShell 查找匹配文件夹,然后从 src 移动到目标
【发布时间】:2015-09-23 21:08:13
【问题描述】:

我需要找出代码以在两个目录中找到匹配的文件夹。

Source Directory

Destination Directory

找到匹配项后,我需要将源目录的内容移动到目标目录,然后从源目录中删除该文件夹。我只希望在目标目录上存在与源目录中的匹配文件夹匹配的文件夹时发生这种情况。

文件夹名称的格式为3;15-cr-2015423-5993

字母和数字每次都会不同,所以我需要搜索文件夹名称的格式,即:

[0-9];[0-9][0-9]-..-[0-9][0-9][0-9][0-9][0-9].

感谢您提供的任何帮助。

【问题讨论】:

  • 我认为包含正则表达式会非常复杂。如果您只是比较文件夹名称,则无需这样做。
  • 您是说文件夹在源和目标中具有相似的名称吗?那么其中一个文件夹将具有不同的名称,但组件将是相同的?我认为你需要向我们展示你想要的更好的例子

标签: powershell match move directory


【解决方案1】:

你可以利用这个模式

(\d+;\d+-\w+-\d+)|(\d+-\d+)

在此处查看演示https://regex101.com/r/wL4iL7/1

说明

(\d+;\d+-\w+-\d+): First group to be captured
(\d+-\d+): second group to be captured

第一组

\d+:matches all numbers
;:matches the semicolon
\d+-: matches all numbers and hyphen
\w+-\d+: matches words hyphen and numbers

第二组

\d+-: matches all numbers and hyphen
\d+: matches the last set of numbers

【讨论】:

  • 我可以找到文件夹并查看它们,但我无法匹配它们并将内容从 src 移动到目标
  • 阅读问题后,我看不出正则表达式如何帮助 OP 或如何回答问题。
【解决方案2】:

Regex 在这里完全没有必要。如果您只是想在我匹配时进行复制,那么您只需要使用带有 Compare-Object cmdlet 的小 PowerShell 来比较列表。更简单的方法是使用我们将要做的 where 过滤器。还要假设您不需要递归逻辑,因为您没有请求它。

$sourceDirectory = "f:\temp\source"
$destinationDirectory = "f:\temp\destination"

$sourceFolders = Get-ChildItem -Path $sourceDirectory | Where-Object{$_.PSisContainer} | Select-Object -ExpandProperty Name
$destinationFolders = Get-ChildItem -Path $destinationDirectory | Where-Object{$_.PSisContainer} | Select-Object -ExpandProperty Name

$matchesInBoth = $sourceFolders | Where-Object{$destinationFolders -contains $_}
$matchesInBoth | ForEach-Object{
    $sourcePath = (Join-Path $sourceDirectory $_)
    Copy-Item -Path $sourcePath -Destination $destinationDirectory -Force -Recurse
    Remove-Item $sourcePath -Force -Recurse #-WhatIf 
}

获取两个目录中的所有文件名。对于两者中的每个目录,我们复制所有内容并删除源目录。

【讨论】:

  • 我试过了,但它只是将文件夹从源移动到目标。移动时它与文件夹不匹配。我确实需要 -recurse 对象来搜索树
  • 我需要你澄清一下比赛应该是什么。当源和目标匹配时,我的代码会移动内容
  • 匹配将是文件夹名称本身。源文件夹结构类似于 U:\Shared\Capture\,然后是一堆子文件夹,其中包含子文件夹。目标文件夹类似于 U:\Shared\Documents\,然后是 3 或 4 层子文件夹。我希望它将源中的任何子文件夹名称匹配到目标中的任何子文件夹。一旦匹配,我希望它将文档从它找到的源文件夹移动到它匹配的目标文件夹。文件名与文件夹名的匹配无关。
  • 基本上文件夹会保留在原来的位置,但与目标文件夹匹配的源文件夹中的内容将从源移动到目标。
  • @beaver 所以匹配是 name =name 而不是一些子字符串或类似的东西?如果文件夹树中有多个匹配项怎么办。如果您删除文件夹内容,它可能会更深入地删除另一个匹配项。或者你认为这不可能发生?基本上我所做的很好接受它不是递归的,你想保留文件夹是吗?
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多