【问题标题】:POWERSHELL script to move only files with numeric digits (within the filename) in commonPOWERSHELL 脚本仅移动具有共同数字的文件(在文件名内)
【发布时间】:2022-01-01 00:42:09
【问题描述】:

过去几天有人帮助我找到了一个 POWERSHELL 脚本,它可以帮助我只移动前 8 个共同字符的文件。

脚本如下,效果很好

$destination_folder = "C:\TEMP\DESTINATION"
$filelist = Get-ChildItem -Path "C:\TEMP\ORIGIN" -File -Force -Recurse
$filelist|Group-Object -Property {$_.basename.Substring(0,8)}|Where-Object Count -gt 1 |
ForEach-Object {$_.Group  | Move-Item -Destination $destination_folder}

我想要并且对我有很大帮助的是修改上述脚本,以便移动至少有 8 个共同数字字符的文件(即使它们不在name) 以便搜索整个文件名,而不仅仅是前 8 个字符。

你认为有可能得到这样的结果吗?

提前感谢大家

【问题讨论】:

  • 您有文件名和结果组的示例列表吗?
  • @BoogaRoo 是的,数字是连续的,但并不总是在文件名的开头;有时它们可​​能位于末尾 (randomfile12345678.pdf),有时位于中间 (random12345678file.pdf) 或有时位于开头 (12345678randomfile.pdf)。谢谢
  • @MathiasR.Jessen 我必须使用的文件的示例列表与我在上面写给 BoogaRoo 的评论中报告的相同。是否足够或您需要更多信息?谢谢
  • this >>> [regex]::Match('asdf1234567890987654321asdf' -replace '[^\d]', '\d{8}').Value
  • 所以,以防万一不是 100% 清楚,要在上面实施 Lee 解决方案,只需执行 $filelist | Group-Object -Property { [regex]::Match($_.BaseName -replace '[^\d]', '\d{8}').Value} | Where-Object { $_.Count -gt 1} ...我删除了我的答案,因为他的答案更优雅,最终让我的答案耻辱。

标签: powershell filenames script get-childitem


【解决方案1】:

由于您的具体问题是关于从字符串中获取所需的数字,这就是如何做到这一点。

代码...

[regex]::Match('asdf1234567890987654321asdf' -replace '\D', '^\d{8}').Value

输出 = 12345678

代码的作用...

  • [regex]::Match(
    使用正则表达式类型加速器调用该类型的匹配静态方法。
  • 'asdf1234567890987654321asdf' -replace '\D'
    这派生了要使用的 Match 调用的字符串。它通过完全替换它们来去除非数字字符。
  • , '^\d{8}'
    这是用于上述字符串的 Match 调用的模式。它会抓取生成的替换字符串的前 8 个字符。
    请注意,这将导致您的 Group-Object 调用在具有超过 8 位数字的 .BaseName 上工作......不仅仅是那些正好有 8 位数字的人。
  • ).Value
    从上一次 [regex]::Match() 调用中获取对象的 .Value 属性中的字符串

你会想用你的 fileinfo 对象中的.BaseName 替换那个愚蠢的示例字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2021-12-19
    • 2022-11-10
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多