<#
Nama Script : TextScriptFilesToFolder.ps1
Deskripsi :
Scan file text / scripting populer (whitelist) di folder target.
Workflow:
1. User input folder
2. Pilih mode extension:
- Enter / 1 = All whitelist
- 2 = Manual pilih extension
- langsung ketik .md atau .ts,.js
3. Script membuat folder sesuai nama file
4. File dipindahkan ke folder tersebut
5. Opsi membuat file tambahan:
i = index.md
y = file dengan nama sama seperti folder
default = tidak membuat file
Aman:
Hanya memproses extension whitelist
Binary files tidak tersentuh
#>
# =============================
# EXTENSION WHITELIST
# =============================
$allowedExtensions = @(
".md",".mdx",".txt",
".js",".mjs",".cjs",
".ts",".tsx",
".php",".py",".rb",
".rs",".go",
".html",".css",".scss",
".json",".yaml",".yml",".toml",
".sh",".ps1",".bat",
".csv"
)
# =============================
# INPUT TARGET FOLDER
# =============================
do {
$targetFolder = Read-Host "📂 Masukkan path folder target"
if (-not (Test-Path $targetFolder)) {
Write-Host "`n❌ Path tidak ditemukan." -ForegroundColor Red
$retry = $true
} else {
$retry = $false
}
} while ($retry)
# =============================
# MODE SELECTION
# =============================
Write-Host ""
Write-Host "Mode pemrosesan:"
Write-Host "1. All (default) → semua extension whitelist"
Write-Host "2. Manual pilih extension"
Write-Host "atau langsung tulis extension contoh: .md atau .md,.ts"
$mode = Read-Host "Masukkan pilihan (Enter = default)"
if ([string]::IsNullOrWhiteSpace($mode) -or $mode -eq "1") {
$extensions = $allowedExtensions
}
elseif ($mode -eq "2") {
Write-Host ""
Write-Host "Extension tersedia:"
Write-Host ($allowedExtensions -join ", ")
$inputExt = Read-Host "Masukkan extension dipisah koma (contoh: .md,.ts)"
$extensions = $inputExt.Split(",") | ForEach-Object {
$_.Trim().ToLower()
}
}
elseif ($mode.StartsWith(".")) {
$extensions = $mode.Split(",") | ForEach-Object {
$_.Trim().ToLower()
}
}
else {
Write-Host "❌ Input tidak valid."
exit
}
# =============================
# VALIDATE EXTENSION
# =============================
$extensions = $extensions | Where-Object {
$allowedExtensions -contains $_
}
if ($extensions.Count -eq 0) {
Write-Host "❌ Tidak ada extension valid." -ForegroundColor Red
exit
}
# =============================
# SCAN FILES
# =============================
$files = Get-ChildItem -Path $targetFolder -File | Where-Object {
$extensions -contains $_.Extension.ToLower()
}
if ($files.Count -eq 0) {
Write-Host "`n⚠️ Tidak ada file cocok ditemukan." -ForegroundColor Yellow
exit
}
Write-Host ""
Write-Host "📄 File ditemukan:" -ForegroundColor Cyan
foreach ($f in $files) {
Write-Host " - $($f.Name)"
}
# =============================
# FILE CREATION OPTION
# =============================
Write-Host ""
Write-Host "Buat file tambahan di dalam folder?"
Write-Host "i = index.md"
Write-Host "y = file dengan nama sama seperti folder"
Write-Host "Enter = No (default)"
$fileOption = Read-Host "Pilihan"
$fileOption = $fileOption.Trim().ToLower()
# =============================
# CONFIRMATION
# =============================
$confirm = Read-Host "`nLanjutkan proses? (Y/N)"
if ($confirm.Trim().ToLower() -ne "y") {
Write-Host "❌ Operasi dibatalkan."
exit
}
# =============================
# PROCESS FILES
# =============================
Write-Host ""
Write-Host "⚙️ Memproses..." -ForegroundColor Green
foreach ($file in $files) {
$name = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
$folderPath = Join-Path $targetFolder $name
if (-not (Test-Path $folderPath)) {
New-Item -ItemType Directory -Path $folderPath | Out-Null
}
$destination = Join-Path $folderPath $file.Name
Move-Item $file.FullName $destination
if ($fileOption -eq "i") {
$indexFile = Join-Path $folderPath "index.md"
if (-not (Test-Path $indexFile)) {
New-Item -ItemType File -Path $indexFile | Out-Null
}
}
elseif ($fileOption -eq "y") {
$sameNameFile = Join-Path $folderPath ($name + ".md")
if (-not (Test-Path $sameNameFile)) {
New-Item -ItemType File -Path $sameNameFile | Out-Null
}
}
Write-Host "✔ $($file.Name) → $name\"
}
Write-Host ""
Write-Host "✅ Selesai."