Powershell gci/重命名限制为33项

Powershell gci/重命名限制为33项,powershell,Powershell,我不知道为什么,但当使用下面的代码时,它会无限循环,在每个文件的开头重复添加“small-”一词 如果我将1..34更改为1..33,它只会像预期的那样迭代一次。事实上,它适用于34岁以下的任何数字,但对于34岁及以上的数字则会中断 这是一个bug还是我不理解的一些奇怪的代码 $dir = '.\Desktop\chroot\testbed\' # File Generator rm $dir\* foreach ($i in (1..34)){ New-Item $dir\File-

我不知道为什么,但当使用下面的代码时,它会无限循环,在每个文件的开头重复添加“small-”一词

如果我将1..34更改为1..33,它只会像预期的那样迭代一次。事实上,它适用于34岁以下的任何数字,但对于34岁及以上的数字则会中断

这是一个bug还是我不理解的一些奇怪的代码

$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}
我不知道为什么,但当使用下面的代码时,它会无限循环,在每个文件的开头重复添加“small-”一词

因为您一直在添加文件夹中最后一个文件之后出现的文件
gci | rename
不会等到收集完所有对象后再对其进行管道处理。它会在对象出现时立即开始对其进行流式处理。您不断添加
gci
查找并添加到管道中的“新”对象。您已经创建了一个反馈循环

我的猜测是,您可以通过这样做来修复它:

$files = gci $dir
$files | Rename-Item -NewName {"Small- " + $_.Name}
gci $dir | sort | Rename-Item -NewName {"Small- " + $_.Name}
或者通过这样做碰巧修复它:

$files = gci $dir
$files | Rename-Item -NewName {"Small- " + $_.Name}
gci $dir | sort | Rename-Item -NewName {"Small- " + $_.Name}
第一个建立集合,然后仅流式传输这些文件。在第二个示例中,
sort
等待它拥有整个集合,然后再将其传递(必须这样才能对集合进行排序)

为什么它在34岁时这么做?我猜想这与目录的内容表的组织方式有关,或者在
rename
gci
之间可能存在竞争条件

我不知道为什么,但当使用下面的代码时,它会无限循环,在每个文件的开头重复添加“small-”一词

因为您一直在添加文件夹中最后一个文件之后出现的文件
gci | rename
不会等到收集完所有对象后再对其进行管道处理。它会在对象出现时立即开始对其进行流式处理。您不断添加
gci
查找并添加到管道中的“新”对象。您已经创建了一个反馈循环

我的猜测是,您可以通过这样做来修复它:

$files = gci $dir
$files | Rename-Item -NewName {"Small- " + $_.Name}
gci $dir | sort | Rename-Item -NewName {"Small- " + $_.Name}
或者通过这样做碰巧修复它:

$files = gci $dir
$files | Rename-Item -NewName {"Small- " + $_.Name}
gci $dir | sort | Rename-Item -NewName {"Small- " + $_.Name}
第一个建立集合,然后仅流式传输这些文件。在第二个示例中,
sort
等待它拥有整个集合,然后再将其传递(必须这样才能对集合进行排序)


为什么它在34岁时这么做?我的猜测是,这与目录的内容表的组织方式有关,或者在
rename
gci

之间可能存在竞争条件,你说“breaks”是什么意思?它会引发异常吗?什么是“破碎”行为?我澄清了描述。你说“破碎”是什么意思?它会引发异常吗?什么是“坏”行为?我澄清了描述。第二个选项工作得很好。顺便说一句,您的变量在第一个选项中是不一致的(对后代而言)。第二个选项工作得很好。顺便说一句,您的变量在第一个变量中是不一致的(为了后代)。