我不知道为什么,但是当使用以下代码时,它会无限循环,添加单词" 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}
答案 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岁时完成?我的猜测是它与目录的内容表的组织方式有关,或者rename
和gci
之间可能存在竞争条件。