按修改日期查找特定文件并复制到相关文件夹

时间:2018-01-28 08:55:43

标签: powershell

我正在寻找一个PowerShell脚本,它可以从源目录中找到文件(N30008xx.txtN30005xx.txt),并通过创建一个具有相同名称的文件夹将它们复制到目标目录该文件的修改日期。

我能够运行以下脚本,该脚本按文件修改日期创建文件夹。

$p = "Filesourcepath"

Get-ChildItem -Path $p |
    Where-Object { ! ($_.PSIsContainer) } | 
    ForEach-Object {
        $newDir = Join-Path $p ($_.LastWriteTime).ToString("yyyy-MM-dd")
        New-Item -Path $newDir -ItemType Directory -ErrorAction SilentlyContinue
        $_ | Move-Item -Destination $newDir
    }

2 个答案:

答案 0 :(得分:1)

您的代码应该原则上。 (截至撰写本文时,对于复制移动存在混淆,并且缺少仅匹配选择文件的方面。)

以下是简化版代码,但 - 您需要为我们提供更多信息诊断你的问题。

以下简化的代码:

  • 利用PSv3 + -File Get-ChildItem参数限制与文件的匹配(与目录相对) - 这样可以节省需要Where-Object { ! $_.PSIsContainer }

  • 使用-LiteralPath传递文字$dir路径;虽然-Path(这也是位置默认值)通常也可以正常工作,但重要的是要注意它将参数解释为通配符表达式,这可能会产生意外结果)

  • 使用-Filter提供文件掩码(通配符表达式);这通常比使用-Path参数更可取,因为它在源(Windows API调用)上进行过滤,因此更快,这在处理大目录时会产生明显的差异。
    警告-Filter参数支持的通配符语言比PowerShell更受限制,并且还带有遗留问题;简而言之:坚持*?应该没问题;有关完整故事,请参阅this well-researched answer

  • 使用-Force代替-ErrorAction SilentlyContinue,以便创建目录或使用预先存在的目录。

    • 请注意,New-Item -ItemType Directory -Force会在两个方案(新创建的目录或预先存在的目录)中返回[System.IO.DirectoryInfo]个实例,代码会利用这些实例。
# Create sample dir. with 2 sample files in it.
$tmpDir = New-Item -Force -Type Directory tmpDir
New-Item -Type File -Force -Path ('N30008xx.txt', 'N30005xx.txt' -replace '^', "$($tmpDir.FullName)/")

$dir = $tmpDir
$fileMask = 'N*.txt'

Get-ChildItem -File -LiteralPath $dir -Filter $fileMask | ForEach-Object {
  $newDir = Join-Path $dir $_.LastWriteTime.ToString("yyyy-MM-dd")
  $_ | Move-Item -Destination (New-Item -ItemType Directory -Force $newDir) 
}
此代码的

警告重新概括

  • 您正在 source 目录中创建目标子目录。

  • 如果您使用Get-ChildItem -Recurse递归处理源目录 ,您最终会处理匹配文件两次:首先移动它们时,然后在移动到的位置找到它们时再次移动它们 (在这种特殊情况下,这只会导致效率低下,因为处理已经移动的文件会尝试将它们移动到它们已经存在的目录中,这是一个安静的无操作。)< / p>

答案 1 :(得分:0)

以下是PowerShell的修改版本,应该可以使用。

注意:您的目标目录不能位于源目录下,否则您将永远进行递归移动。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    switch response.actionIdentifier {
    case UNNotificationDismissActionIdentifier:
        print("Dismiss Action")
    case UNNotificationDefaultActionIdentifier:
        print("Default")
        // Do Action Here
    case "Snooze":
        print("Snooze")
    case "Delete":
        print("Delete")
    default:
        print("Unknown action")
    }

    completionHandler()
}