Привет, мне нужна небольшая помощь по созданию структуры папок с помощью PowerShell.
Указывая на корневую папку [Yearly Structure Folder], я ищу в этой папке следующую структуру.
Первый слой подпапок будет представлять собой месяцы года с префиксом числа, чтобы сохранить их в порядке.
[01. January] до [12. December]
Внутри каждой папки месяца будет следующая подструктура.
[01. General], [02. Housekeep in], [03. Housekeep out], [04. Record], [05. Timesheet]
Даты месяца будут находиться в каждой из вышеуказанных папок и иметь названия 01.01.2024, 02.01.2024 (дд-ММ-гггг) и т. д. с указанием количества дней в каждом месяце.
от [01.01.2024] до [31.01.2024] с правильными датами в этом месяце
Тогда в каждой из папок с одной датой будут эти папки в каждой.
[01. Request], [02. Copies], [03. Report], [04. Recom], [05. Checks], [06. Forms]
Я приложил изображение общей структуры за один месяц. Я также просматривал эти сообщения, хотя они похожи на то, что я хочу. Когда я редактирую их и запускаю, я получаю ошибки и не знаю, как их объединить.
создайте структуру папок с именем и датой +7 дней
Благодарю всех, у кого есть немного времени, чтобы помочь мне начать с этого :)
Я также просматривал эти сообщения, хотя они похожи на то, что я хочу. Когда я редактирую их и запускаю, я получаю ошибки и не знаю, как их объединить.
создайте структуру папок с именем и датой +7 дней
Это то, что у меня есть до сих пор, хотя мне не нужно исключать даты и не нужны отдельные даты с префиксом числа.
{New-Item -Path "C:\Yearly Structure Folder" -Type Directory
$folders = ("01. General", "02. Housekeep in", "03. Housekeep out", "04. Record", "05. Timesheet" )
$folders | ForEach { New-Item -Path "C:\Yearly Structure Folder" -Name $_ -Type Directory }
$startDate = [datetime]'01-01-2024'
$endDate = $startDate.AddMonths(12)
$startWeek = 1
$folderPath = "C:\Yearly Structure Folder\01. General"
$datesToExclude = @(
# This will Exclude 30 of December 2021
) | ForEach-Object {$_ -as [datetime]}
do
{
if ($startDate -notin $datesToExclude)
{
$folderName = "{0} {1}" -f $startWeek, $startDate.ToString('dd.MM.yyyy')
$newFolderPath = Join-Path $folderPath -ChildPath $folderName
New-Item $newFolderPath -ItemType Directory
}
$startDate = $startDate.AddDays(1)
$startWeek++
}until($startDate -ge $endDate)
Вы можете начать с обмена ошибками: учиться на них — значит избегать их повторения. Также нам будет легче помочь.
Добро пожаловать в SO, пользователь 24911908. SO не является бесплатным специализированным сервисом программирования. Покажите нам код, который вы пытаетесь заставить работать.
Извините, ребята, я отредактировал ОП.





Вам нужно использовать вложенные циклы
Вот самый маленький пример, который мне удалось сделать
Я не сомневаюсь, что есть более эффективный способ, возможно, с помощью хеш-таблиц.
# replace the value with whatever you need
$Path = '.\'
$MonthSubDirectoryNameList = '01. General', '02. Housekeep in', '03. Housekeep out', '04. Record', '05. Timesheet'
$DaySubDirectoryNameList = '01. Request', '02. Copies', '03. Report', '04. Recom', '05. Checks', '06. Forms'
# set the year you want.
$Year = 2024
# set the starting date to january 1
$Date=Get-Date -Year $year -Month 1 -Day 1
# Set culture for the name of the Month.
# Invariant Culture FTW if you do not need some specific language
$Culture = [cultureinfo]::InvariantCulture
# for each day starting from 1 of January
# as long the Year is equal to $Year
# do stuff
# adding 1 day at the end of each loop
for ($Date; $date.year -eq $Year; $Date = $Date.AddDays(1)) {
foreach ($MonthSub in $MonthSubDirectoryNameList) {
foreach ($DaySub in $DaySubDirectoryNameList) {
#$DayDirectory = Join-Path -Path $Year -ChildPath $Date.ToString('MM. MMMM', $Culture) -AdditionalChildPath $MonthSub, $Date.ToString('dd.MM.yyyy'), $DaySub
$DayDirectory = [System.IO.Path]::Combine($year, $Date.ToString('MM. MMMM', $Culture) , $MonthSub, $Date.ToString('dd.MM.yyyy'), $DaySub)
# assigned to $null to hide the output.
$Null = New-Item -ItemType Directory -Path $PAth -Name $DayDirectory -Force
}
}
}
Я изменил путь, но получил эту ошибку. [Join-Path : A parameter cannot be found that matches parameter name 'AdditionalChildPath'. At line:28 char:99 + ... ath $Date.ToString('MM. MMMM', $Culture) -AdditionalChildPath $MonthS ... + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Join-Path], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.JoinPathCommand]
моя вина, я все время забываю спрашивать людей, какую версию powershell они используют. Я обновил код, чтобы использовать $DayDirectory = [System.IO.Path]::Combine($year, $Date.ToString('MM. MMMM', $Culture) , $MonthSub, $Date.ToString('dd.MM.yyyy'), $DaySub), который работает как для 5.1, так и для 7+.
Хороший друг мой. Просто нужно выяснить, как реализовать это в Sharepoint сейчас:/
Ах, я только что заметил, что для папок 01. January также понадобится год, например 01. January 2024, и без указания года в верхней папке. ВИНОВАТ
Подобные исправления вы легко можете сделать сами. Ознакомьтесь с Teh Docs, чтобы узнать, как форматировать время в строках.
Единственный человек, который может «приступить» к этому, — это вы. Если вы столкнулись с ошибками, которые вы не понимаете, и вам нужна помощь в устранении неполадок: опубликуйте точные команды, которые вы запускали, и соответствующие сообщения об ошибках полностью — мы не видим ваш экран :)