好的,我已经花费数小时进行研究并尝试了各种方法,但仍然无法使其正常运行。我需要从get-childitem
创建一个string[]
对象,并将其传递给Copy-Item
的-exclude
参数。
难点在于我需要进行递归并且需要相对路径,所以这是我想出来的解决方案:
$((Get-ChildItem -Path $Dest -Recurse -File).FullName.TrimStart($Dest))
这将生成一个干净的现有文件列表,以相对路径呈现到
$dest
中。问题在于,如果我将此添加到copy-item
-exclude
参数中,它似乎会忽略它。在线上进一步研究表明,如果不是string[]
类型,copy-item
将忽略-exclude
参数。如果我检查上述命令返回的类型,我会得到
System.Object[]
。 我希望它是System.String[]
或只是普通的String[]
。如何将上述命令的输出转换为字符串数组?
为了清晰起见,使用
copy-item
的完整命令如下:Copy-Item -Path (Join-Path $src "*") -Destination $dest -Recurse -Force -Exclude $((Get-ChildItem -Path $Dest -Recurse -File).FullName.TrimStart($Dest))
我的最终目标是递归复制文件而不会覆盖现有文件。
TrimStart()
不应该这样使用。它需要一个字符数组,其中所有出现的字符都将从字符串开头删除,而不是要从开头删除的确切字符串;对于这种情况,您需要像.FullName.Substring($Dest.Length)
这样的东西。显然,在这里TrimStart($Dest)
对您起作用,这表明$Dest
不包含尾部反斜杠。如果有尾部反斜杠,它可能会从$Dest
长度之外的相对子路径中删除字符。 - Lance U. Matthews