Powershell 在使用 copy-item 命令时不排除特定的子文件夹
Powershell not excluding specific sub folders when use copy-item command
我在 PS 有点笨。我已经解决了这里记录的所有问题,并尽我所能为我工作,但不幸的是并没有像我想要的那样为我工作。
我正在尝试复制整个文件夹结构,但不包括一些。例如,我想复制整个 c:\Program Files\myTest
到目的地 C:\Program Files\TargetTest
除了(排除以下文件夹)
c:\Program Files\myTest\_Backup 和 c:\Program Files\myTest\Processor\Reports
$SourceFolder = "$env:ProgramFiles\myTest\"
$ReportExclude="$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
$TargetFolder = "$env:ProgramFiles\TargetTest"
$BackupRootFolderName = "_Backup"
$BackupRootFolderPath = "$TargetFolder$BackupRootFolderName"
$BackupFolderPath = "$BackupRootFolderPath$(Get-Date -format yyyyMMdd_HHmmss)"
Get-Item -Path $SourceFolder\* -Exclude $ReportExclude, _Backup| % { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder -recurse}
当我 运行 在上面编写代码时,它会复制所有内容并排除唯一的 _Backup,但无论如何都会复制报告 folder/files,我不想被复制。
有人可以调查一下并指出我做错了什么吗。
非常感谢
您的问题是 copy-item 语句中的 -recurse 开关。
获取项目
将为该命令提供文件夹“$env:ProgramFiles\myTest\”,
Copy-Item -Recurse
然后将复制该文件夹,包括所有子文件夹。
试试这个:
Get-ChildItem -Path $SourceFolder\* -Exclude $ReportExclude, _Backup -Recurse | % { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder}
这应该首先生成所有文件夹和文件的列表(包括子文件夹),忽略您要排除的那些,然后将它们每个复制到目标位置。
当当。有时间我会检查合适的解决方案。
解决方案并不那么简单,-Exclude 开关排除文件夹但不排除子项目,-Filter 开关使用通配符但将单个字符串作为参数..(顺便说一下,@whatever 是对的,当他说 - Copy-Item 上的递归开关取消对 Get-ChildItems 的排除)
最后我以一种肮脏但有效的方式解决了它:
Get-ChildItem -Path $SourceFolder -Recurse | ? { $_.FullName -notlike $ReportExclude -and $_.FullName -notlike $BackupRootFolderName } | % { write-host $_.FullName; Copy-Item -Path $_.FullName -Destination $($_.FullName -replace $SourceFolder, $TargetFolder) -Force}
编辑,因为我不明白你的配置有什么问题,让我们用 loggin 测试一个完整的脚本:
$SourceFolder = "$env:ProgramFiles\myTest\"
$ReportExclude = "$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
$TargetFolder = "$env:ProgramFiles\TargetTest"
$BackupRootFolderName = "_Backup"
$BackupRootFolderPath = "$TargetFolder$BackupRootFolderName"
$BackupFolderPath = "$BackupRootFolderPath$(Get-Date -format yyyyMMdd_HHmmss)"
$ErrorActionPreference = "Continue"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
Function Copy-MyFiles($FileFullNameSource)
{
try
{
Write-Verbose "file source : $FileFullNameSource"
if ($FileFullNameSource -notlike $ReportExclude -and $FileFullName -notlike $BackupRootFolderName)
{
$FileFullNameDestination = $FileFullNameSource -replace $SourceFolder, $TargetFolder
Write-Verbose "file destination : $FileFullNameDestination"
Copy-Item -Path $FileFullNameSource -Destination $FileFullNameDestination -Force
if (Test-Path $FileFullNameDestination)
{
Write-Host "$FileFullNameDestination ok" -ForegroundColor Green
}
else
{
Write-Warning "$FileFullNameDestination is missing in destination folder"
}
}
else
{
Write-Host "$FileFullNameSource is excluded"
}
}
catch
{
Write-Warning ($_.Exception | Select-Object -Property Message | Out-String)
}
}
Write-Verbose "source folder : $SourceFolder"
Write-Verbose "target folder : $TargetFolder"
Get-ChildItem -Path $SourceFolder -Recurse | % { Copy-MyFiles $_.FullName }
我在 PS 有点笨。我已经解决了这里记录的所有问题,并尽我所能为我工作,但不幸的是并没有像我想要的那样为我工作。
我正在尝试复制整个文件夹结构,但不包括一些。例如,我想复制整个 c:\Program Files\myTest 到目的地 C:\Program Files\TargetTest 除了(排除以下文件夹) c:\Program Files\myTest\_Backup 和 c:\Program Files\myTest\Processor\Reports
$SourceFolder = "$env:ProgramFiles\myTest\"
$ReportExclude="$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
$TargetFolder = "$env:ProgramFiles\TargetTest"
$BackupRootFolderName = "_Backup"
$BackupRootFolderPath = "$TargetFolder$BackupRootFolderName"
$BackupFolderPath = "$BackupRootFolderPath$(Get-Date -format yyyyMMdd_HHmmss)"
Get-Item -Path $SourceFolder\* -Exclude $ReportExclude, _Backup| % { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder -recurse}
当我 运行 在上面编写代码时,它会复制所有内容并排除唯一的 _Backup,但无论如何都会复制报告 folder/files,我不想被复制。
有人可以调查一下并指出我做错了什么吗。
非常感谢
您的问题是 copy-item 语句中的 -recurse 开关。
获取项目
将为该命令提供文件夹“$env:ProgramFiles\myTest\”,
Copy-Item -Recurse
然后将复制该文件夹,包括所有子文件夹。 试试这个:
Get-ChildItem -Path $SourceFolder\* -Exclude $ReportExclude, _Backup -Recurse | % { write-host $_.fullname; Copy-Item -path $_.fullname -destination $TargetFolder}
这应该首先生成所有文件夹和文件的列表(包括子文件夹),忽略您要排除的那些,然后将它们每个复制到目标位置。
当当。有时间我会检查合适的解决方案。
解决方案并不那么简单,-Exclude 开关排除文件夹但不排除子项目,-Filter 开关使用通配符但将单个字符串作为参数..(顺便说一下,@whatever 是对的,当他说 - Copy-Item 上的递归开关取消对 Get-ChildItems 的排除)
最后我以一种肮脏但有效的方式解决了它:
Get-ChildItem -Path $SourceFolder -Recurse | ? { $_.FullName -notlike $ReportExclude -and $_.FullName -notlike $BackupRootFolderName } | % { write-host $_.FullName; Copy-Item -Path $_.FullName -Destination $($_.FullName -replace $SourceFolder, $TargetFolder) -Force}
编辑,因为我不明白你的配置有什么问题,让我们用 loggin 测试一个完整的脚本:
$SourceFolder = "$env:ProgramFiles\myTest\"
$ReportExclude = "$env:ProgramFiles\myTest\Processor\Reports\*.rdl"
$TargetFolder = "$env:ProgramFiles\TargetTest"
$BackupRootFolderName = "_Backup"
$BackupRootFolderPath = "$TargetFolder$BackupRootFolderName"
$BackupFolderPath = "$BackupRootFolderPath$(Get-Date -format yyyyMMdd_HHmmss)"
$ErrorActionPreference = "Continue"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
Function Copy-MyFiles($FileFullNameSource)
{
try
{
Write-Verbose "file source : $FileFullNameSource"
if ($FileFullNameSource -notlike $ReportExclude -and $FileFullName -notlike $BackupRootFolderName)
{
$FileFullNameDestination = $FileFullNameSource -replace $SourceFolder, $TargetFolder
Write-Verbose "file destination : $FileFullNameDestination"
Copy-Item -Path $FileFullNameSource -Destination $FileFullNameDestination -Force
if (Test-Path $FileFullNameDestination)
{
Write-Host "$FileFullNameDestination ok" -ForegroundColor Green
}
else
{
Write-Warning "$FileFullNameDestination is missing in destination folder"
}
}
else
{
Write-Host "$FileFullNameSource is excluded"
}
}
catch
{
Write-Warning ($_.Exception | Select-Object -Property Message | Out-String)
}
}
Write-Verbose "source folder : $SourceFolder"
Write-Verbose "target folder : $TargetFolder"
Get-ChildItem -Path $SourceFolder -Recurse | % { Copy-MyFiles $_.FullName }