如何使用 PowerShell 移动某些文件夹以外的项目?

How to move items excluding certain folder using PowerShell?

这个问题是对真实问题的过度简化。

我有一个文件夹,我们称它为“ParentFolder”。此文件夹中包含文件和子文件夹。我希望所有文件和子文件夹都从“ParentFolder”中移出,除了一个特定的子文件夹,我们称它为“SpecificChildFolder”。对于“SpecificChildFolder”,我不想移动文件夹,只移动其中的文件。

我可以分别完成这两项任务。我可以移动“ParentFolder”中的所有文件和文件夹(包括“SpecificChildFolder”),也可以仅移动“SpecificChildFolder”中的文件(不包括“ParentFolder”中的其余文件和子文件夹)。

我希望这两个任务同时发生。

我想我会在两个不同的函数中完成这个:

  1. 移动除“SpecificChildFolder”之外的所有内容
  2. 从“SpecificChildFolder”中移动文件

第 2 阶段代码有效。这是第 1 阶段,我有问题。 我也试过 Get-ChildItem $src -ErrorAction SilentlyContinue | Where-Object {$_.Directory.Name -NotLike "*SpecificChildFolder*"} | ForEach-Object{} 但这也不起作用

其次,一行PowerShell不会发生这种情况吗?

我正在使用 PowerShell Core 7.2

第 1 阶段代码:

#Sources 
$src = "C:\User\Desktop\TEST\ParentFolder\*"
$srcMcaNameChg = "C:\User\Desktop\TEST\ParentFolder"
#Destination 
$dest = "C:\Users\harguls\Desktop\TEST\DestinationFolder"

Function MoveFiles{
    Param(
        [string]$src,
        [string]$dest,
        [string]$srcNameChange
    )
   Get-ChildItem $src -Recurse -Exclude 'SpecificChildFolder' -ErrorAction SilentlyContinue | ForEach-Object{
        $fileName = $_.Name
        # Check for duplicate files
        $file = Test-Path -Path $dest$fileName
        Write-Output $file
        if($file)
        {
        "$srcNameChange$fileName" | Rename-Item -NewName ("Copy_"+$fileName)      
        }   
    }
    Move-Item -Path $src  -Destination $dest -Force
} 
MoveFiles -src $src -dest $dest -srcNameChange $srcMcaNameChg

这是您想要完成的目标的模糊表示,希望行内注释具有解释性。

$source = '\path\to\source\folder'
$destination = '\path\to\destination\folder'
# you can add multiple folders here if you want
$exceptWith = 'foldertoexclude1', 'foldertoexclude2'

# get only the subfolders of `$source` and iterate over them
Get-ChildItem $source -Directory | ForEach-Object {
    # if this folder name is in the folders to exclude array
    if($_.Name -in $exceptWith) {
        # get only the files of this folder and move them to destination
        Get-ChildItem $exclude -File | Move-Item -Destination $destination
        # if we're here we can proceed with next subfolder
        return
    }
    # if we're here means that the name of the folder was not in `$exceptWith`
    # so we move this folder and all it's child folders / files
    Move-Item -LiteralPath $_.FullName -Destination $destination -Recurse
}