【问题标题】:Copy only file that matches variable string仅复制与变量字符串匹配的文件
【发布时间】:2017-03-01 23:44:03
【问题描述】:

我正在尝试根据Get-Date 的时间戳复制文件,以将其与filename_10_00.ext 结构中从不同来源保存的文件相匹配。如果我使用 24 小时制,我可以使用 Get-Date 的小时数来确定我要查找的文件。 (这是运行每小时备份)

这就是我所拥有的:

$current_time = Get-Date
$hour_var = $current_time.Hour
Get-ChildItem -Path \\Path\To\Source | Where-Object {
    $_.Name -match "$hour_var"
} | Copy-Item -Destination \\Path\To\Destination 

有人可以告诉我为什么它似乎与我提供的 PowerShell 不匹配吗?

我正在寻找理想情况下没有导入模块的纯 PowerShell。

【问题讨论】:

  • 请显示Get-ChildItem -Path \\Path\To\Source 的示例输出以及Get-ChildItem -Path \\Path\To\Source | Where-Object {$_.Name -match "$hour_var"} 的期望和实际输出。
  • 很遗憾,没有样本输出。所需的输出是它使用 $hour_var 作为正则表达式来扫描“filename_hh_mm_ss.ext”的所有文件,以比较从 $hour_var 返回的小时与文件名中的 hh 小时。
  • 如果Get-ChildItem -Path \\Path\To\Source 没有产生任何输出,为什么你会惊讶于没有被复制?
  • 我很抱歉。我将 Get-ChildItem -Path \\Path\To\Source 的输出误解为副本的输出。将 Get-ChildItem 命令分配给 $test 后,当我写入主机 $test 时,我可以看到该文件夹​​中的文件

标签: powershell copy copy-item


【解决方案1】:

假设小时格式的前导零试试这个:

$Src = "\\Path\To\Source"
$Dst = "\\Path\To\Destination"

$CurrHour = (Get-Date).Hour.ToString('00')
Get-ChildItem -Path $Src *_??_??.ext | 
  Where-Object BaseName -match "^.*_$CurrHour_\d{2}$" | 
    Copy-Item -Destination $Dst -whatif

如果输出看起来正常,请删除 -whatif

【讨论】:

  • 使用此示例似乎不会在 -whatif 上产生任何输出,并且删除 -whatif 似乎不会复制任何内容。我已经使用实际的源和目标路径以及文件扩展名对其进行了修改,以提供更准确的示例。 Src 和 Dts 是 PC 上的共享文件夹,我以管理员身份运行。 $Src = "\\WIN-F4GLTG2LGVN\Source"$Dst = "\\WIN-F4GLTG2LGVN\Destination"$CurrHour = (Get-Date).Hour.ToString('00')Get-ChildItem -Path $Src filename_??_??.txt | Where-Object BaseName -match "^filename_$CurrHour_\d{2}$" | Copy-Item -Destination $Dst -whatif
  • 您是否调整了伪 filename 以适应您的环境?
  • 我没有,但我更担心共享文件夹可能会导致问题而不是文件名,所以我希望它们更严格。出于测试目的,filename_12_00.txt 将是一个合法的示例。
  • 更改了上面的限制,它使用通配符 *._??_??.ext 过滤 gci 中的文件名和模式 "^.*_$CurrHour_\d{2}$" 以匹配小时。这在我的本地测试中有效。
  • 效果很好。感谢您的宝贵时间!
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2018-01-06
相关资源
最近更新 更多