根据条件将文件移动到 parent 内的新文件夹
Moving files to a new folder inside their parent based on a criteria
我目前正在用 Powershell 做一个项目,我真的不是很熟悉。我已经很接近了,并且做了一些环顾四周以使我更接近,但我对这个重要时刻感到难过。
目标是递归搜索目录以查找前缀为“\_7Y_
”的文件(这是由我编写的另一个脚本根据文件年龄完成的)并在该文件中创建一个新的子目录parent 然后把它移到那里。例如,如果我有 ~\desktop\old\_7Y_OldFile.txt
,我希望该文件转到 ~\desktop\old\_7Y_\_7Y_OldFile.txt
,并且我希望它对每个文件递归执行此操作。
我的脚本当前按预期创建文件夹,但只选择一个新文件夹将项目移动到其中。我认为这是由于 $child 变量只选择了那个值,因为在它移动文件后脚本继续,但在试图找到要移动的文件时出错。没有手动告诉它每个 parent(这个过程最终会自动进行),我想知道可以做些什么来区分每个 $child 的移动。
这也是我的理解,只要我使用 -force,我就不需要执行 New-Item 然后 Move-Item,但这也不是我的经验。任何帮助将不胜感激。
对于奇怪的格式和技术,我深表歉意——我一直在边学边学 powershell。
[CmdletBinding()]
Param(
[Parameter(mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType 'any'})]
[string] $InputFilePath
)
#this sets the filepath parameter to mandatory, so you will need to input
your own filepath!
$directoryInfo = Get-ChildItem $InputFilePath -recurse | Measure-Object
Yno = Get-ChildItem $InputFilePath -recurse | Where-Object {$_.Name -like '_7Y_*.*'} | Measure-Object
#These are used as the conditions for the if statements
#directoryInfo gets the number of files in the directory; 7Yno gets the number of files prepended with _7Y_ in the directory
$Confirmation = Read-Host "Are you SURE you want to proceed with this operation? All selected files in the given directory will be moved to new directories! This action is irreversable. Your selected directory is $InputFilePath. Enter 'Yes' to proceed"
if ($Confirmation -eq "Yes") {
if ($directoryInfo.count -gt 0 -and Yno.count -gt 0){ #Check: Files in directory and files prepended with _7Y_ in directory.
$children = @((Get-ChildItem $InputFilePath -recurse |
Where-Object {$_.Name -like "_7Y_*.*"}).directory.fullname |
Get-Unique)
$Files = @(Get-ChildItem $children -recurse |
Where-Object {$_.Name -like "_7Y_*.*"})
foreach($child in $children){
yPath = "$child\_7Y_"
New-Item -itemtype Directory -path yPath -force
}
foreach($file in $Files){
Move-Item $file.fullname -destination yPath -force
}
}
if ($directoryInfo.count -gt 0 -and Yno.count -eq 0){ #Check: Files in directory, but no files prepended with _7Y_ in directory.
Read-Host "There are no files prepended with _7Y_ in this directory!"
}
if ($directoryInfo.count -eq 0){ #Check: No files in directory.
Read-Host "There are no files in this directory!"
}
}
你是 IMO 把事情复杂化了。
- 递归获取带前缀的 ChildItem
- 如果父文件夹名称不等于前缀
- 检查文件夹是否存在,如果不存在则创建
- 将文件移动到文件夹
编辑:简化脚本,仅使用一次 "$($_.Directory)$Prefix"
Push-Location 'X:\Folder\to\start'
$Prefix = '_7Y_'
Get-ChildItem -File -Filter "$Prefix*" -Recurse |
Where-Object {$_.Directory.Name -ne $Prefix} |
ForEach-Object {
$DirPrefix = "$($_.Directory)$Prefix"
If(!(Test-Path $DirPrefix)){
Md $DirPrefix | Out-Null
}
$_ | Move -Destination $DirPrefix
}
之前的样本树/F
└───one
│ _7Y_one.txt
│
└───two
│ _7Y_two.txt
│
└───three
│ _7Y_three.txt
│
└───four
_7Y_four.txt
在 运行 脚本之后
───one
├───two
│ ├───three
│ │ ├───four
│ │ │ └───_7Y_
│ │ │ _7Y_four.txt
│ │ │
│ │ └───_7Y_
│ │ _7Y_three.txt
│ │
│ └───_7Y_
│ _7Y_two.txt
│
└───_7Y_
_7Y_one.txt
解释行:
If(!(Test-Path "$($_.Directory)$Prefix"))
- 当在字符串表达式中寻址对象
$_.Directory
的 属性 时,您必须将其包含在 $()
中以进行 unambiguous/force 评估。
- Test-Path returns $true/$false,要反转条件,请在 If - 中使用
-not
或 - 用 !(Test-Path ...)
取反
我目前正在用 Powershell 做一个项目,我真的不是很熟悉。我已经很接近了,并且做了一些环顾四周以使我更接近,但我对这个重要时刻感到难过。
目标是递归搜索目录以查找前缀为“\_7Y_
”的文件(这是由我编写的另一个脚本根据文件年龄完成的)并在该文件中创建一个新的子目录parent 然后把它移到那里。例如,如果我有 ~\desktop\old\_7Y_OldFile.txt
,我希望该文件转到 ~\desktop\old\_7Y_\_7Y_OldFile.txt
,并且我希望它对每个文件递归执行此操作。
我的脚本当前按预期创建文件夹,但只选择一个新文件夹将项目移动到其中。我认为这是由于 $child 变量只选择了那个值,因为在它移动文件后脚本继续,但在试图找到要移动的文件时出错。没有手动告诉它每个 parent(这个过程最终会自动进行),我想知道可以做些什么来区分每个 $child 的移动。
这也是我的理解,只要我使用 -force,我就不需要执行 New-Item 然后 Move-Item,但这也不是我的经验。任何帮助将不胜感激。
对于奇怪的格式和技术,我深表歉意——我一直在边学边学 powershell。
[CmdletBinding()]
Param(
[Parameter(mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType 'any'})]
[string] $InputFilePath
)
#this sets the filepath parameter to mandatory, so you will need to input
your own filepath!
$directoryInfo = Get-ChildItem $InputFilePath -recurse | Measure-Object
Yno = Get-ChildItem $InputFilePath -recurse | Where-Object {$_.Name -like '_7Y_*.*'} | Measure-Object
#These are used as the conditions for the if statements
#directoryInfo gets the number of files in the directory; 7Yno gets the number of files prepended with _7Y_ in the directory
$Confirmation = Read-Host "Are you SURE you want to proceed with this operation? All selected files in the given directory will be moved to new directories! This action is irreversable. Your selected directory is $InputFilePath. Enter 'Yes' to proceed"
if ($Confirmation -eq "Yes") {
if ($directoryInfo.count -gt 0 -and Yno.count -gt 0){ #Check: Files in directory and files prepended with _7Y_ in directory.
$children = @((Get-ChildItem $InputFilePath -recurse |
Where-Object {$_.Name -like "_7Y_*.*"}).directory.fullname |
Get-Unique)
$Files = @(Get-ChildItem $children -recurse |
Where-Object {$_.Name -like "_7Y_*.*"})
foreach($child in $children){
yPath = "$child\_7Y_"
New-Item -itemtype Directory -path yPath -force
}
foreach($file in $Files){
Move-Item $file.fullname -destination yPath -force
}
}
if ($directoryInfo.count -gt 0 -and Yno.count -eq 0){ #Check: Files in directory, but no files prepended with _7Y_ in directory.
Read-Host "There are no files prepended with _7Y_ in this directory!"
}
if ($directoryInfo.count -eq 0){ #Check: No files in directory.
Read-Host "There are no files in this directory!"
}
}
你是 IMO 把事情复杂化了。
- 递归获取带前缀的 ChildItem
- 如果父文件夹名称不等于前缀
- 检查文件夹是否存在,如果不存在则创建
- 将文件移动到文件夹
编辑:简化脚本,仅使用一次 "$($_.Directory)$Prefix"
Push-Location 'X:\Folder\to\start'
$Prefix = '_7Y_'
Get-ChildItem -File -Filter "$Prefix*" -Recurse |
Where-Object {$_.Directory.Name -ne $Prefix} |
ForEach-Object {
$DirPrefix = "$($_.Directory)$Prefix"
If(!(Test-Path $DirPrefix)){
Md $DirPrefix | Out-Null
}
$_ | Move -Destination $DirPrefix
}
之前的样本树/F
└───one
│ _7Y_one.txt
│
└───two
│ _7Y_two.txt
│
└───three
│ _7Y_three.txt
│
└───four
_7Y_four.txt
在 运行 脚本之后
───one
├───two
│ ├───three
│ │ ├───four
│ │ │ └───_7Y_
│ │ │ _7Y_four.txt
│ │ │
│ │ └───_7Y_
│ │ _7Y_three.txt
│ │
│ └───_7Y_
│ _7Y_two.txt
│
└───_7Y_
_7Y_one.txt
解释行:
If(!(Test-Path "$($_.Directory)$Prefix"))
- 当在字符串表达式中寻址对象
$_.Directory
的 属性 时,您必须将其包含在$()
中以进行 unambiguous/force 评估。 - Test-Path returns $true/$false,要反转条件,请在 If - 中使用
-not
或 - 用!(Test-Path ...)
取反