【问题标题】:Powershell: Save files based on their extension and sequence duplicates?Powershell:根据扩展名和序列重复保存文件?
【发布时间】:2018-07-18 15:04:35
【问题描述】:

我有一个 FTP 服务器上的文件列表,我将其保存到本地驱动器。我还根据文件扩展名重命名文件。如何保存文件以便它们覆盖任何现有文件但也按顺序重命名,因此如果有多个具有相同扩展名的文件,它们将被命名为 ext.txt ext2.txt ext3.txt 等?我的代码目前正在覆盖文件,因此每个扩展名最终只有 1 个文件。这是相关的部分:

$myfiles | ForEach-Object{

$extension = ([System.IO.Path]::GetExtension($_.Name)).Trim(".")

$session.GetFiles($session.EscapeFileMask($remotePath + $_.Name), 
"$localPath\$extension.txt" ).Check()
}

【问题讨论】:

标签: powershell winscp


【解决方案1】:

TessellatingHeckler 在他的评论中列出了许多几乎重复的问题,但为了解决您的具体情况(仅关注序列号,而不是文件系统方面):

$myFiles | ForEach-Object { $i = 0 } {

  $extension = ([System.IO.Path]::GetExtension($_.Name)).Trim(".")
  if (++$i -gt 1) {
    $extension += $i
  }

  # ...

}
  • 脚本块{ $i = 0 }绑定ForEach-Object-Begin参数,用于流水线处理开始前的初始化;在这种情况下,保存序列号的变量 ($i) 被初始化为 0
    (当您稍后第一次应用++ 时,您可以依赖$i 默认0,但这会很脆弱,因为可能有一个预先存在的$i 值。)

  • if (++$i -gt 1) { ... 递增 $i 并且仅在其值大于 12 或更大)时进入块。
    实际上,该块仅从 2nd 输入对象开始输入。

  • $extension += $i 执行 string 连接(因为$extension 包含一个[string] 实例)并将序列号附加到扩展名,因此ext 变为ext2 时例如,首先输入块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2012-04-05
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多