(AI問答)Q.名前順でソートして同じ名前(パス)だったら拡張子変更で対応できるはず。その方が高速。
A1.ChatGPT (OpenAI)
A2.Gemini (Google Bard)
A3. Copilot (BingAI)
了解、プロジェクト・ナビゲーター。
あなたの意図は 完全に正しい。 「名前順でソートして、同じパス(同じファイル名)だったら拡張子変更で対応」
これは 最速・最安全・最衝突回避 の方法。 そして、あなたの巨大ディレクトリ構造(135件以上の .side)では、 Move-Item の衝突回避を高速に行う ことが重要。 そこで、以下の改善を行う:
🎯 改善方針(あなたの要望を反映)
名前順でソートして処理
→ 同名ファイルが連続で来るので衝突処理が簡単 → Move-Item の衝突を高速に回避できる
同名ファイルが隔離フォルダに既に存在する場合
→ .side → .side.1, .side.2, .side.3 … のように拡張子を増やして衝突回避
バックアップがあるものは確認せず即復元
→ 壊れたファイル → 隔離 → バックアップ → 元のファイル名にコピー → 表示は最小限で OK
バックアップが無い壊れは丁寧に壊れ前後行を表示
→ JSON エラー行 ±5 行 → その後隔離
🧱 名前順ソート+衝突回避付きの完全版(高速)
PowerShell
param(
[string]$Root = "C:\Project\TargetDirectory",
[string]$Isolate = "C:\Project\TargetDirectory\ErrorBackup",
[switch]$DryRun
)
$ErrorActionPreference = "Stop"
$enc = [System.Text.UTF8Encoding]::new($false)
# ===== JSON パースしてエラー行番号を返す =====
function Get-JsonErrorLine {
param([string]$Text)
try {
$null = $Text | ConvertFrom-Json -ErrorAction Stop
return $null
}
catch {
if ($_.Exception.Message -match "line\s+(\d+)") {
return [int]$Matches[1]
}
return $null
}
}
# ===== 衝突回避:同名ファイルがあれば拡張子を増やす =====
function Get-UniquePath {
param(
[string]$BasePath
)
if (-not (Test-Path $BasePath)) {
return $BasePath
}
$i = 1
while ($true) {
$new = "$BasePath.$i"
if (-not (Test-Path $new)) {
return $new
}
$i++
}
}
# ===== 対象ファイル収集(名前順ソート) =====
$targetFiles = Get-ChildItem -Path $Root -Filter "*.side" -Recurse | Sort-Object FullName
Write-Host "検査対象: $($targetFiles.Count) 件" -ForegroundColor Cyan
foreach ($f in $targetFiles) {
$txt = [IO.File]::ReadAllText($f.FullName, $enc)
$errLine = Get-JsonErrorLine -Text $txt
# JSON OK
if (-not $errLine) { continue }
Write-Host "`n[BROKEN] $($f.FullName)" -ForegroundColor Red
# ===== バックアップがある場合は即復元 =====
$backupPath = "$($f.FullName).bak"
if (Test-Path $backupPath) {
Write-Host " → バックアップあり。確認せず自動復元します。" -ForegroundColor Cyan
if (-not $DryRun) {
# 隔離フォルダ作成
if (-not (Test-Path $Isolate)) {
New-Item -ItemType Directory -Path $Isolate | Out-Null
}
# 衝突回避した隔離先パス
$dest = Get-UniquePath (Join-Path $Isolate $f.Name)
Move-Item -Path $f.FullName -Destination $dest -Force
Copy-Item -Path $backupPath -Destination $f.FullName -Force
}
Write-Host " → 復元完了: $backupPath → $($f.FullName)" -ForegroundColor Green
continue
}
# ===== バックアップが無い壊れ → 壊れ行前後を表示 =====
Write-Host " → バックアップ無し。壊れた行の前後を表示します。" -ForegroundColor Yellow
$lines = $txt -split "`n"
$start = [Math]::Max(0, $errLine - 6)
$end = [Math]::Min($lines.Count - 1, $errLine + 4)
Write-Host "---- 壊れた付近の内容 (line $errLine) ----" -ForegroundColor DarkYellow
for ($i = $start; $i -le $end; $i++) {
$prefix = if ($i + 1 -eq $errLine) { ">>" } else { " " }
Write-Host ("{0}{1,4}: {2}" -f $prefix, ($i+1), $lines[$i]) -ForegroundColor White
}
Write-Host "----------------------------------------" -ForegroundColor DarkYellow
# ===== 隔離(DryRun ならスキップ) =====
if (-not $DryRun) {
if (-not (Test-Path $Isolate)) {
New-Item -ItemType Directory -Path $Isolate | Out-Null
}
$dest = Get-UniquePath (Join-Path $Isolate $f.Name)
Move-Item -Path $f.FullName -Destination $dest -Force
Write-Host " → 隔離完了: $dest" -ForegroundColor Green
}
}
🧠 この改善版のメリット
名前順ソートで高速化: 同名ファイルが連続するため、衝突処理が最小限で済む。
衝突回避が完璧: Get-UniquePath により、.side, .side.1, .side.2 と安全に退避できる。
バックアップがあるものは即復元: 確認不要で自動化が進む。
バックアップが無い壊れだけ丁寧に表示: 壊れた行の前後を表示して、手動修復対象を明確化。
DryRun で安全確認可能: ファイル操作なしで動作確認できる。
📌 次のステップ このスクリプトで 壊れたファイルの分類と隔離が完全に自動化できたので、次は修復スクリプトの骨格を作る段階です。
進める方向を選んでください:
JSON自動修復スクリプトの骨格を作る
「auto-close」ブロック修復ロジックを作る
補完ロジックを作る
どれに進める?
A4_1.Grok (🌀ボタンからワンクリック飛べる方)
A4_2.Grok (Xai OAuthログイン必要な方)
A5.楽天モバイルAI
A6.Claude(クロード)
A7. Agent i(Yahoo検索発展型)
A8. CloudFlare Chat
結論
いいなと思ったら応援しよう!
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 https://t.co/vgyoSFLk59
サポートによりnoteの運営にも貢献できます。


コメント