Powershell gci / rename限制为33件

时间:2015-11-25 02:20:43

标签: powershell

我不知道为什么,但是当使用以下代码时,它会无限循环,添加单词" small - "反复到每个文件的开头。

如果我将1..34更改为1..33,它只会按预期迭代一次。事实上,它适用于34以下的任何数字,但是34和34以上的数据。

这是一个错误还是一些我不理解的代码的奇怪之处?

$dir = '.\Desktop\chroot\testbed\'

# File Generator
rm $dir\*
foreach ($i in (1..34)){
    New-Item $dir\File-$i.txt -type file
}

gci $dir | Rename-Item -NewName {"Small- " + $_.Name}

1 个答案:

答案 0 :(得分:3)

  

我不知道为什么,但是当使用以下代码时,它会无限循环,添加单词" small - "到了每个文件的开头。

因为您不断添加文件夹中最后一个文件之后出现的文件。 gci | rename不会等到所有对象都被收集后再进行管道传输。它会在出现时立即开始流式传输。你不断添加" new" gci找到并添加到管道的对象。您已经创建了一个反馈循环。

我的猜测是你可以通过这样做来解决它:

$files = gci $dir
$files | Rename-Item -NewName {"Small- " + $_.Name}

或巧合地解决这个问题:

gci $dir | sort | Rename-Item -NewName {"Small- " + $_.Name}

第一个建立集合,然后流只是那些文件。在第二个中,sort在传递它之前一直等到它有整个集合(它必须为了对集合进行排序)。

为什么它会在34岁时完成?我的猜测是它与目录的内容表的组织方式有关,或者renamegci之间可能存在竞争条件。