Get-ChildItem and Copy-Item explanation

15

为什么会

gci $from -Recurse | copy-item -Destination  $to -Recurse -Force -Container

不能以相同的方式行事

copy-item $from $to -Recurse -Force

我认为应该是一样的,但不知何故它并不相同。为什么呢?


有什么区别吗?第二个脚本没有递归复制吗?这里有一个人使用% foreach帮助我复制所有输出:https://dev59.com/WWMl5IYBdhLWcg3w_bDj - RayofCommand
5个回答

21

你没有遍历文件/文件夹集合中的每个项目,而是将最后一个值传递给管道。您需要使用Foreach-item或%来执行Copy-Item命令。此外,由于已经在GCI中拥有每个项目,因此您也不需要第二个-recurse开关。

请尝试以下操作:

gci $from -Recurse | % {copy-item -Path $_ -Destination  $to -Force -Container }

4
gci $from -Recurse不应该获取目录中的所有文件并将它们通过管道传输吗? - Dejan Dakić
复制项目命令中不是缺少了 $_ 吗?在我的 PS 5.0 上无法运行。 实际命令为:gci $from -Recurse | % { copy-item $_ -Destination $to -Force } - kumarharsh
1
你是正确的,kumar_harsh,我在原回答中忽略了 $_。我已经做了一些小修改。 - websch01ar

3
这是对我有用的方法。
Get-ChildItem -Path .\ -Recurse -Include *.txt | %{Join-Path -Path $_.Directory -ChildPath $_.Name } | Copy-Item -Destination $to

不需要使用Join-Path,而是在Copy-Item中使用$_.FullName - WhatIsHeDoing

2
这对我有效:
Get-ChildItem 'c:\source\' -Recurse | % {Copy-Item -Path $_.FullName -Destination 'd:\Dest\' -Force -Container }

1
请提供为什么这个答案能够解决问题的解释。 - Dragonthoughts
也许它并不直接相关,但对于那些希望更好地了解在不同方式下实现相同结果的各种方法的人可能会有所帮助。 - Andy Wrench

-1

开关设置错误。应该是:

gci -Path $from -Recurse | copy-item -Destination  $to -Force -Container

-1
要循环遍历所有项目,可以这样做:
gci -Path $from -Recurse | % { $_ | copy-item -Destination  $to -Force -Container}

只需使用 foreach 循环并再次对每个项目进行管道处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接