获取-ChildItem与联接路径是工作主要是为我,但我意识到这是抄袭其他根目录下,这是不好的内部根目录。
例如
目标: 复制每childitem内C:\ SomeFolder \ CopyInHere到d根:\ PutItInHere,但不包括C:\ SomeFolder \ CopyInHere本身。
- 例如带上CopyInHere的所有孩子,让他们成为PutItInere的儿童
上面的例子大部分都是这样做的,但是它会创建一个名为SubFolder的文件夹,并在名为SubFolder的文件夹中创建一个文件夹。
这是因为加入路径计算SubFolder子项的d:\ PutItInHere \ SubFolder的目标路径,所以SubFolder get的创建在名为SubFolder的文件夹中。
我通过使用Get-ChildItems取回项目的集合,然后使用循环通过它来解决这个问题。
Param(
[Parameter(Mandatory=$True,Position=1)][string]$sourceDirectory,
[Parameter(Mandatory=$True,Position=2)][string]$destinationDirectory
)
$sourceDI = [System.IO.DirectoryInfo]$sourceDirectory
$destinationDI = [System.IO.DirectoryInfo]$destinationDirectory
$itemsToCopy = Get-ChildItem $sourceDirectory -Recurse -Exclude @('*.cs', 'Views\Mimicry\*')
foreach ($item in $itemsToCopy){
$subPath = $item.FullName.Substring($sourceDI.FullName.Length)
$destination = Join-Path $destinationDirectory $subPath
if ($item -is [System.IO.DirectoryInfo]){
$itemDI = [System.IO.DirectoryInfo]$item
if ($itemDI.Parent.FullName.TrimEnd("\") -eq $sourceDI.FullName.TrimEnd("\")){
$destination = $destinationDI.FullName
}
}
$itemOutput = New-Object PSObject
$itemOutput | Add-Member -Type NoteProperty -Name Source -Value $item.FullName
$itemOutput | Add-Member -Type NoteProperty -Name Destination -Value $destination
$itemOutput | Format-List
Copy-Item -Path $item.FullName -Destination $destination -Force
}
简而言之,它将目前项目的全名用于目的地计算。然后它会检查它是否是一个DirectoryInfo对象。如果是,它会检查父文件夹是否为源目录,这意味着当前正在迭代的文件夹是源目录的直接子目录,因此我们不应将其名称附加到目标目录,因为我们希望该文件夹是在目标目录中创建,而不是在目标目录中的文件夹中创建。
接下来,其他每个文件夹都会正常工作。
这只是我要发布解决方案的预期问题的片段。 :)我发现-Include和-Exclude对于Select-String,Copy-Item和其他一些命令不起作用。它适用于Get-ChildItem(dir)。 – JasonMArcher 2009-04-09 00:01:10
IIRC,如果您查看这些cmdlet的帮助文件,则表明这些参数无法按预期工作。出货是选择。 – 2009-04-09 14:42:53
谢谢亚伦 - 完美的工作! – Guy 2009-04-09 19:10:29