Powershell:根据文件的扩展名和序列重复项保存文件吗?

时间:2018-07-18 15:04:35

标签: powershell winscp

我有一个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()
}

1 个答案:

答案 0 :(得分:1)

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

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

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

  # ...

}
  • 脚本块{ $i = 0 }绑定到-Begin的{​​{1}}参数,该参数用于在管道处理开始之前进行初始化;在这种情况下,用于保存序列号(ForEach-Object)的变量将初始化为$i
    (您以后第一次使用0时,可以依靠$i 默认值0,但这会很脆弱,因为可能已经存在++值。)

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

  • 2执行 string 串联(因为$extension += $i包含一个$extension实例),并将序列号附加到扩展名上,这样{{例如,当第一次输入该块时,1}}就变成[string]