如何使用 PowerShell 移动某些文件夹以外的项目?
How to move items excluding certain folder using PowerShell?
这个问题是对真实问题的过度简化。
我有一个文件夹,我们称它为“ParentFolder”。此文件夹中包含文件和子文件夹。我希望所有文件和子文件夹都从“ParentFolder”中移出,除了一个特定的子文件夹,我们称它为“SpecificChildFolder”。对于“SpecificChildFolder”,我不想移动文件夹,只移动其中的文件。
我可以分别完成这两项任务。我可以移动“ParentFolder”中的所有文件和文件夹(包括“SpecificChildFolder”),也可以仅移动“SpecificChildFolder”中的文件(不包括“ParentFolder”中的其余文件和子文件夹)。
我希望这两个任务同时发生。
我想我会在两个不同的函数中完成这个:
- 移动除“SpecificChildFolder”之外的所有内容
- 从“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
}
这个问题是对真实问题的过度简化。
我有一个文件夹,我们称它为“ParentFolder”。此文件夹中包含文件和子文件夹。我希望所有文件和子文件夹都从“ParentFolder”中移出,除了一个特定的子文件夹,我们称它为“SpecificChildFolder”。对于“SpecificChildFolder”,我不想移动文件夹,只移动其中的文件。
我可以分别完成这两项任务。我可以移动“ParentFolder”中的所有文件和文件夹(包括“SpecificChildFolder”),也可以仅移动“SpecificChildFolder”中的文件(不包括“ParentFolder”中的其余文件和子文件夹)。
我希望这两个任务同时发生。
我想我会在两个不同的函数中完成这个:
- 移动除“SpecificChildFolder”之外的所有内容
- 从“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
}