![在多个根文件夹中创建子文件夹需要批处理或 PowerShell 脚本](https://linux22.com/image/1614826/%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%A0%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E9%9C%80%E8%A6%81%E6%89%B9%E5%A4%84%E7%90%86%E6%88%96%20PowerShell%20%E8%84%9A%E6%9C%AC.png)
我有大量的根文件夹(非连续命名),我需要一个脚本来在每个根文件夹内创建一组重复的子文件夹,如下所示:
例子
- Root Folder 1
- Sub Folder A
- Sub Sub Folder 1
- Sub Sub Folder 2
- Sub Sub Folder 3
- Sub Sub Folder 4
- Sub Sub Folder 5
- Sub Folder B
- Sub Folder C
- Root Folder 2
- Sub Folder A
- Sub Sub Folder 1
- Sub Sub Folder 2
- Sub Sub Folder 3
- Sub Sub Folder 4
- Sub Sub Folder 5
- Sub Folder B
- Sub Folder C
...等等。
所有根文件夹的子文件夹和子子文件夹的命名都是一致的,但是根文件夹名称会有所不同。
我能够通过以下方式使用 TXT 文件的输出在 D:\TEMP 目录中创建根文件夹:
for /F "usebackq delims=" %i in (FolderNames.txt) do md "%i"
我还可以通过一系列 PowerShell 命令在每个根文件夹中创建第一级子文件夹:
$folders = get-childitem "C:\TEMP\WORKING\FOLDERS"
foreach ($folder in $folders ) {
New-Item -Name "Daily Completion Paperwork" -Path $folder.FullName -ItemType Directory -verbose;
New-Item -Name "Final Completion Documents" -Path $folder.FullName -ItemType Directory -verbose;
New-Item -Name "Site Documents" -Path $folder.FullName -ItemType Directory -verbose
}
这给了我:
- Root Folder 1
- Sub Folder A
- Sub Folder B
- Sub Folder C
- Root Folder 2
- Sub Folder A
- Sub Folder B
- Sub Folder C
我正在努力的是一个单独的命令 - 或者一个嵌套的命令 - 它将创建子文件夹 A 内的 5 个“子子文件夹”:
例子
- Root Folder 1
- Sub Folder A
- Sub Sub Folder 1
- Sub Sub Folder 2
- Sub Sub Folder 3
- Sub Sub Folder 4
- Sub Sub Folder 5
- Root Folder 2
- Sub Folder A
- Sub Sub Folder 1
- Sub Sub Folder 2
- Sub Sub Folder 3
- Sub Sub Folder 4
- Sub Sub Folder 5
不幸的是,这涉及到一个我无法确定的嵌套级别;到目前为止,我只是在里面创建了“子子文件夹”全部文件夹,这会造成更大的问题。
非常感谢有关如何修改我现有的 PowerShell 命令的任何建议!
答案1
对于这个特定的例子,我将创建一个辅助函数来按照您的需要创建每个文件夹结构。
像这样:
function New-FolderTree {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
[string]$Rootfolder,
[string]$LevelOneName, # name pattern for level 1 subfolders
[string]$LevelTwoName, # name pattern for level 2 subfolders
[int]$LevelOneCount, # howmany level 1 subfolders
[int]$LevelTwoCount # howmany level 2 subfolders
)
# step 1: create the rootfolder including the level one subfolders
for ($i = 1; $i -le $LevelOneCount; $i++) {
# LevelOne foldernames get a suffix of _A, _B, _C, etc.
$path = Join-Path -Path $Rootfolder -ChildPath ('{0}_{1}' -f $LevelOneName, [char](64 + $i))
if (!(Test-Path -Path $path -PathType Container)) {
$null = New-Item -Path $path -ItemType Directory
}
}
# step 2: create all level 2 subfolders in the first level 1 subfolder
$subfolderA = Join-Path -Path $Rootfolder -ChildPath ($LevelOneName + '_A')
for ($i = 1; $i -le $LevelTwoCount; $i++) {
# LevelTwo foldernames get a suffix of _1, _2, _3, etc.
$path = Join-Path -Path $subfolderA -ChildPath ('{0}_{1}' -f $LevelTwoName, $i)
if (!(Test-Path -Path $path -PathType Container)) {
$null = New-Item -Path $path -ItemType Directory
}
}
}
使用该功能,您可以快速创建每个文件夹结构
New-FolderTree -Rootfolder 'D:\RootFolder1' -LevelOneName 'SubFolder' -LevelOneCount 3 -LevelTwoName 'SubSubFolder' -LevelTwoCount 5
New-FolderTree -Rootfolder 'D:\RootFolder2' -LevelOneName 'SubFolder' -LevelOneCount 3 -LevelTwoName 'SubSubFolder' -LevelTwoCount 5
答案2
如果所有子文件夹都有相同的子子文件夹,则只需要嵌套 ForEach。溅射使代码更具可读性:
$Level1 = 'Daily Completion Paperwork',
'Final Completion Documents',
'Site Documents'
$Level2 = 1..5
Get-ChildItem -Directory "C:\TEMP\WORKING\FOLDERS"| ForEach{
$Splat =@{
'Path' = $_.FullName
'ItemType' = 'Directory'
}
$Level1 | FOrEach{
$Splat2 = @{
'Path' = (New-Item @Splat -Name $_).FullName
'ItemType' = 'Directory'
}
$Level2 | ForEach{
New-Item @Splat2 -Name $_ | Out-Null
}
}
}
答案3
尽管有 PowerShell。
最佳实践是,在操作系统文件系统上,避免在文件、文件夹和变量名称中使用空格。如果你这样做,你只会自找麻烦。始终使用下划线作为分隔符,或使用 CamelCasedNames 等,以免出现不必要的麻烦、挫败感和烦恼。
一个非常粗略的简单步骤,可以为您的用例提供更多的动态,可能是这样的(当然,修改到您想要的深度 - 如果您希望它真正创建东西,请删除-WhatIf。):
# Using a single nested loop
Clear-Host
# Pass in a defined root folder array list to create root folders.
1..3 |
ForEach {
"Creating new folder root named RootFolder$PSItem"
New-Item -Path 'D:\Temp' -ItemType Directory -Name "RootFolder$PSItem" -WhatIf
$RootFolderPath = "D:\Temp\RootFolder$PSItem"
# Ask for a end boundary for sub folder array list
$FolderCount = Read-Host -Prompt "
For the new rootFolder $RootFolderPath, how many sub folders do you need.
Enter a number."
# Pass in a defined root folder araay list to crete child folders.
1..$FolderCount |
ForEach {
"Using a sub folder count of $FolderCount
Creating sub folder 1 - SubFolder$FolderCount"
New-Item -Path $RootFolderPath -ItemType Directory -Name "SubFolderr$PSitem" -WhatIf
}
"`n"
'*'*60
"*** Finished creating scaffold for $RootFolderPath ***"
'*'*60
"`n"
}
# Results
<#
Creating new folder root named RootFolder1
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1".
For the new rootFolder D:\Temp\RootFolder1, how many sub folders do you need.
Enter a number.: 5
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1\SubFolderr1".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1\SubFolderr2".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1\SubFolderr3".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1\SubFolderr4".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder1\SubFolderr5".
************************************************************
*** Finished creating scaffold for D:\Temp\RootFolder1 ***
************************************************************
Creating new folder root named RootFolder2
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2".
For the new rootFolder D:\Temp\RootFolder2, how many sub folders do you need.
Enter a number.: 5
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2\SubFolderr1".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2\SubFolderr2".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2\SubFolderr3".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2\SubFolderr4".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder2\SubFolderr5".
************************************************************
*** Finished creating scaffold for D:\Temp\RootFolder2 ***
************************************************************
Creating new folder root named RootFolder3
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3".
For the new rootFolder D:\Temp\RootFolder3, how many sub folders do you need.
Enter a number.: 5
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3\SubFolderr1".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3\SubFolderr2".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3\SubFolderr3".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3\SubFolderr4".
Using a sub folder count of 5
Creating sub folder 1 - SubFolder5
What if: Performing the operation "Create Directory" on target "Destination: D:\Temp\RootFolder3\SubFolderr5".
************************************************************
*** Finished creating scaffold for D:\Temp\RootFolder3 ***
************************************************************
#>