【问题标题】:Assistance with script to copy files to directories based on substring of filename协助脚本根据文件名的子字符串将文件复制到目录
【发布时间】:2019-08-28 20:58:57
【问题描述】:

处理脚本以根据文件名的子字符串将文件复制到特定的现有文件夹。

文件以年份和月份数字结尾的格式命名,例如:

RawData_MJE_2019_7.xlsx
Checklist_2019_7.xlsx
RawData_MJE_2019_6.xlsx
Checklist_2019_6.xlsx

我有以类似格式命名的现有目标目录,例如:

C:\Save\2019_7
C:\Save\2019_8

希望将文件名中包含年份和月份的源文件复制到名称相似的目标目录?所以任何包含 2019_7 的源文件都会被复制到 C:\Save\2019_7 文件夹中。

我在复制项目上遇到错误;想知道这是否是由于目标目录的文件夹名称中的空格:

$SourceFolder = "C:\Users\hy85170\Documents\VBTemp\Output\Formatted"
$TargetFolder = "C:\Users\hy85170\OneDrive - Chemours\Documents\Chemours\CONTROLLERSHIP\Data Analytics\MJE\0. Data\1. Output Files\To Upload"
$Files = Get-ChildItem $SourceFolder | where {$_.extension -in ".xlsx"} | select -expand basename
Foreach ($File in $Files)
{
    $Year = $File.Substring(0,4)
    $Month = $File.Substring(4,1)
    $Directory = $TargetFolder + "\" + $Year+$Month
    $files | Copy-Item -Destination $Directory
}

错误:

Copy-Item : Cannot find path 'C:\Users\hy85170\RawDataWhole_MJE_2019_7' because it does not exist.
At C:\Users\hy85170\Desktop\VBTemp\VBScripts\CopyOutputFiles.ps1:11 char:11
+     $files | Copy-Item -Destination $Directory
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Users\hy85170\RawDataWhole_MJE_2019_7:String) [Copy-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand

【问题讨论】:

  • 1.为什么你发布一个新问题而不是编辑你的previous one?只要您的编辑正常,无论如何都会重新打开它。 2、你发的代码绝对不是batch-file! 3.您的代码没有反映您描述的目的地位置!
  • 1) 我没有看到编辑原始帖子的方法 - 它说它已关闭; 2) 是的,我意识到这不是一个批处理文件——请原谅我不小心没有更改标签; 3) 是的,我意识到我描述的位置与目的地不同——它是我想要做的一个简单的例子。 4)还有什么问题要骂我吗?
  • 1.编辑按钮(我什至在原始问题中链接)仍然可用;当问题成为话题时,有一个重新开放的投票系统(就像关闭一样)。 2. 无论如何现在修复;请注意,标签对于吸引适当的观众回答您的问题很重要(您至少应该真正使用tour)。 3. 示例和代码应该匹配,以便潜在的回答者可以轻松地试验您的脚本和数据;对他们来说越容易,您就越有可能得到满意的答案。 4.没有理由感到沮丧......
  • 您在复制命令中使用了$Files [复数形式]。这不是您用于当前循环项目的名称。 [grin] ///// 您扩展了文件 basename,然后在复制之前不要重新添加扩展名。这会使您的复制命令失败,因为源位置中没有此类文件。

标签: powershell


【解决方案1】:

您可以执行类似以下的操作:

$SourceFolder = "C:\Users\hy85170\Documents\VBTemp\Output\Formatted"
$TargetFolder = "C:\Users\hy85170\OneDrive - Chemours\Documents\Chemours\CONTROLLERSHIP\Data Analytics\MJE\0. Data\1. Output Files\To Upload"
$Files = Get-ChildItem $SourceFolder | where {$_.extension -in ".xlsx" -and $_.basename -match "\d{4}_\d{1,2}$"}

foreach ($file in $Files) {
    $date = ($file.BaseName | Select-String -Pattern "\d{4}_\d{1,2}$").Matches.Value
    $year,$month = $date -split "_"
    $Directory = Join-Path -Path $TargetFolder -ChildPath $date
    $file.FullName | Copy-Item -Destination $Directory
}

说明:

正则表达式模式\d{4}_\d{1,2}$ 用于匹配文件基本名称末尾的Year_Month 字符串。 $date 包含 Year_Month 字符串。当我们在_ 上拆分$date 时,将输出一个包含年月的数组。数组的第一个元素(年份)存储在$year 中。数组的第二个元素(月)存储在$month 中。 Join-Path 命令可用于将多个文件夹连接到一个路径中,这将自动添加\ 字符。


在您的尝试中,您收到一个错误,因为您的 Copy-Item 命令在当前目录中查找您要复制的文件。所以除非你在Copy-Item 执行之前更改为$SourceFolder,否则你会收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 2020-04-07
    • 2014-06-06
    • 2019-11-26
    • 2011-11-30
    • 2021-07-12
    • 2017-03-15
    • 2019-10-30
    相关资源
    最近更新 更多