我有一个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()
}
答案 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) { ...
,并且只有在其值大于$i
(1
或更大)时才进入该块。
实际上,只能从 2nd 输入对象开始输入该块。
2
执行 string 串联(因为$extension += $i
包含一个$extension
实例),并将序列号附加到扩展名上,这样{{例如,当第一次输入该块时,1}}就变成[string]
。