【问题标题】:POWERSHELL script to check which files have only first part of filename in common and moving only these filesPOWERSHELL 脚本检查哪些文件只有文件名的第一部分是共同的,并且只移动这些文件
【发布时间】:2021-12-19 02:55:52
【问题描述】:

自从我在 POWERSHELL 中寻找一个脚本以来,它允许我检查一个文件夹中文件名的第一部分(前 8 个字符),其中有多个文件,并且只移动到另一个文件夹.

到目前为止,我已经能够隔离文件名的第一部分,但我找不到比较和移动重复文件的方法。

下面是我到现在才意识到的代码

$filelist = Get-ChildItem -Path "C:\TEMP\ORIGIN"
foreach ($file in $fileList)
{
$key = $file.BaseName.Substring(0,8)
#to be sure the filename part is correct
echo $key
}

感谢所有可以帮助我的人

【问题讨论】:

  • 那么如果有相同的 8 个字符的文件,把它们移到别处?
  • “双”是什么意思?这是否意味着文件相同? FILE0123_stuff.txt 是否与 FILE0123_stuff2.txt 相同?您如何确定应该移动的其他一 (1) 个文件?文件名前缀(前 8 个字符)在扫描目录之前是否已知,还是所有文件名的前 8 个字符都需要识别?
  • 检查$filelist|Group-Object -Property {$_.basename.Substring(0,8)}|Where-Object Count -gt 1
  • @JosefZ,Group-Object 应该有一个 -ErrorAction SilentlyContinue 以忽略少于 8 个字符的基本名称。
  • JosefZ 的方法很好,但最好使用Group-Object -Property {-join $_.BaseName[0..8]} 来避免抛出如 lit 所指出的那样。

标签: powershell filenames script


【解决方案1】:

感谢@Josefz 的建议以及@lit 和@Santiago 提供的详细信息,我终于完成了我的脚本。

$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}

【讨论】:

  • | Where-Object { $_.BaseName.Length -ge 8 } 附加到 Get-ChildItem 行,因此当您使用 Substring(0,8) 对文件进行分组时,您不会遇到异常
  • @Theo 感谢您的建议,我也添加了您的建议 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多