OneDrive配下でPowerShellの削除・移動が「アクセスが拒否されました」で止まる。Pythonで移して直した
走らせて5分たった移動のスクリプトは、エラーの行を3,064行も書いていました。
進み具合の行には、3,000件を処理して成功0件と出ています。
12:19:29 ERROR (ファイルの場所) : パスへのアクセスは拒否されました。
12:23:46 progress 3000/18915 ok=0
2026年10月16日、パソコンの空きを作るため、動画や音声のファイルを別のドライブへ移していたときです。
移す先には、写しがきちんとできていました。
消せなかったのは、写し終えた元のファイルのほうでした。
作業フォルダは %USERPROFILE%\OneDrive\デスクトップ の下にあります。
OneDriveは、Microsoftのクラウドにファイルを置き、パソコンと同期する仕組みです。
デスクトップのフォルダごと、OneDriveに入れている形になります。
なぜ拒否されたのかは、まだ言い切れません。
ただ、同じファイルが、別のやり方なら消せました。
実際に通した手順と、記録を並べて見えた共通点を書きます。
拒否されたのは、別起動したPowerShellだった
部下役のAI(Claude Code)は、時間のかかる処理をPowerShellのスクリプトにして動かします。
AIがコマンドを動かす道具は、1回に10分までしか待てないためです。
そこで Start-Process を使い、画面を出さない別のPowerShellとして切り離していました。Start-Process は、新しいプロセス(動いているプログラムの単位)を起動する命令です。
スクリプトは、1件ずつ次の順で動く作りでした。
Copy-Item -LiteralPath $f.FullName -Destination $to -Force -ErrorAction Stop
if ((Get-Item -LiteralPath $to).Length -eq $f.Length) {
Remove-Item -LiteralPath $f.FullName -Force -ErrorAction Stop
}
写して、大きさを比べて、元を消す流れです。
このうち、元を消す Remove-Item だけが毎回拒否されていました。
写しは別のドライブに残り、元もそのまま残ります。
放っておけば、同じファイルが2か所にあるだけの状態になるところでした。
拒否されたファイルの1つを、部下役のAIが作業中のシェルから消してみました。
Bash(文字で命令を打つ画面の一種)の rm でも消えました。
作業中のPowerShellで Remove-Item -LiteralPath -Force を打っても、同じく消えています。
同じファイルを同じユーザーで扱い、違うのは起動のしかただけでした。
同じ日の朝は、Move-ItemとCopy-Itemで出ていた
実は同じ10月16日の朝8時40分ごろにも、似た止まり方をしていました。
動画用の絵をまとめて作り直すスクリプトを、やはり Start-Process で切り離したときです。
Move-Item : パスへのアクセスは拒否されました。
+ CategoryInfo : PermissionDenied: (…\_gen\09\09.png:FileInfo) [Move-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : MoveFileInfoItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.MoveItemCommand
古い絵を退避する Move-Item と、新しい絵で上書きする Copy-Item が、どちらも拒否されました。Copy-Item のほうは、パス '…\09.png' へのアクセスが拒否されました。 という文面です。
このときも、作業中のPowerShellで同じ Copy-Item を打つと通りました。
スクリプトを作業中のシェルから直接動かした回は、拒否の表示が出ずに終わっています。
UnauthorizedAccessException は、権限で断られたことを表す例外(処理を止める知らせ)です。
PowerShellの土台にある .NET が出します。
英語の表示なら Access to the path '…' is denied. です。
別起動をやめて、作業中のシェルからPythonで移した
10月16日の昼は、切り離したPowerShellを止めました。
代わりに、同じ対象を移すPythonのスクリプトを作り、作業中のシェルから直接走らせています。
10分の制限は、道具の背景実行(終わったら知らせてもらう形)で避けました。
すでに同じ大きさの写しがあるものは、写さずに元だけを消す作りです。
12時25分に始めて、12時37分に21,097件をエラー0で移し終えました。
Cドライブの空きは、41.7GBから158.2GBに増えています。
1件だけ移すなら、次の1行で足ります。
python -c "import shutil,sys; shutil.move(sys.argv[1], sys.argv[2])" "元のファイル" "移動先のファイル"
上書きのコピーなら、shutil.move を shutil.copyfile に替えます。
どちらも11月13日に、OneDriveの外の試し用フォルダで動くことを確かめました。
Git Bash(Windowsで使えるBashの一つ)があるなら、mv や cp -f でも構いません。
11月の作業手順にも、PowerShellのコピーが拒否されたら shutil.copyfile で写す、と書き足しました。
効いたのは、Pythonに替えたことよりも、どのプロセスから動かすかだと見ています。
10月の2件は、どちらも作業中のシェルから動かすと通ったからです。
Start-Processを使わなくても、出た日があった
ただ、これで全部を説明できるわけではありません。
10月24日にも、退避の Move-Item が同じように拒否されたと、後の作業指示に残っています。
11月6日の夜には、Start-Process を使わず、作業中のPowerShellから子として起動したスクリプトでも出ました。
このときは英語の表示です。
Copy-Item : Access to the path '…\06b.png' is denied.
+ FullyQualifiedErrorId : CopyFileInfoItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand
記録を並べると、拒否されたのは、OneDriveの中にすでにあるファイルを消す・動かす・上書きする操作だけでした。
OneDriveの外へ写す操作や、新しいファイルを作る操作は通っています。
作業メモには「OneDriveの保護」と書いていますが、確かめた言葉ではありません。
同期中のロック(ほかのプログラムが使っていて触れない状態)も考えられます。
セキュリティソフトの見張りも候補です。
10月16日に、Windowsのランサムウェア対策の設定を読もうとしましたが、エラーで読めませんでした。
どれも確かめていないので、ここでは候補にとどめます。
-Force を付けても直らないのは、公式の説明どおりでした。
Remove-Item の説明には、Force を付けてもセキュリティの制限は越えられない、とあります。
自分の環境で切り分ける
同じエラーに当たったら、まず例外の種類と文面をそのまま出します。
$f = "消したいファイルのフルパス"
try { Remove-Item -LiteralPath $f -Force -ErrorAction Stop; "deleted" }
catch { $_.Exception.GetType().FullName; $_.Exception.Message }
System.UnauthorizedAccessException と出れば、この記事と同じ形です。
次に、同じ行を、いま開いているPowerShellの画面で打ってみてください。
画面では通り、スクリプトの中だけで拒否されるなら、起動のしかたが絡んでいます。
11月13日に、OneDriveの外で比べ試しもしました。Start-Process で隠して起動したPowerShellからでも、Remove-Item と Move-Item は通っています。
OneDriveの中では、同じ試しをしていません。
ファイルとフォルダの属性も見ておきます。
(Get-Item -LiteralPath $f).Attributes
11月13日に見ると、OneDriveの中のデスクトップのフォルダは ReadOnly, Directory, ReparsePoint でした。
再解析ポイントは、ファイルやフォルダに付けておける追加の情報です。
ファイルを開くとき、Windowsはこの情報に合う仕組み(ファイル システム フィルター)を探して処理を任せます。
作業フォルダの中のファイルは Archive だけで、再解析ポイントではありませんでした。
OneDriveには、ファイルをクラウドだけに置いておける、ファイル オンデマンドという機能があります。
公式の説明では、青い雲のアイコンが、オンラインでのみ使えるファイルの印です。
雲のファイルやフォルダを消せない話は、検索でもよく見かけます。
僕の件は、手元にある普通のファイルで起きたので、別の形だと見ています。
途中で止まったら、二重に残った分を確かめる
写すことと消すことを分けて書くと、途中で止まったとき、同じファイルが2か所に残ります。Move-Item も、公式の説明では、新しい場所に加えてから元の場所から消す動きです。
10月16日も、最初の版が写し終えた分は、移す先と元の両方にありました。
やり直す前に、両方の大きさを比べます。
(Get-Item -LiteralPath "元のファイル").Length
(Get-Item -LiteralPath "写した先のファイル").Length
同じなら、元だけを消せば済みます。
Python版の移動も、この考え方で、写しがある分は元を消すだけにしました。
二重に残ったファイルは、最後には1つも残っていません。
参考
- 運営記録 2026-10-16(朝):絵の一括処理で Move-Item と Copy-Item が拒否・作業中のシェルから写した
- 運営記録 2026-10-16(昼):別のドライブへの移動で Remove-Item が拒否・Pythonで21,097件を移した
- 運営記録 2026-10-24・2026-11-06:退避の Move-Item と、上書きの Copy-Item が拒否
- 運営記録 2026-11-13:属性の確認と、OneDriveの外での比べ試し
- Remove-Item(PowerShell 5.1・日本語版、2026年11月13日確認):https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/remove-item?view=powershell-5.1
- Move-Item(PowerShell 5.1・日本語版、2026年11月13日確認):https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/move-item?view=powershell-5.1
- OneDrive のファイル オンデマンド(Microsoft サポート、2026年11月13日確認):https://support.microsoft.com/ja-jp/office/onedrive-%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%82%AA%E3%83%B3%E3%83%87%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E9%A0%98%E5%9F%9F%E3%82%92%E7%AF%80%E7%B4%84%E3%81%99%E3%82%8B-0e6860d3-d9f3-4971-b321-7092438fb38e
- 再解析ポイント(Microsoft Learn・日本語版、2026年11月13日確認):https://learn.microsoft.com/ja-jp/windows/win32/fileio/reparse-points
切り離したPowerShellは、文字コードでも黙って失敗していました。
Claude Codeが書いた.ps1が文字化けして動かない(PowerShell 5.1)。先頭にBOMを付けたら直った
切り離した処理を止めようとして、自分まで止めた話もあります。
PowerShellのStop-Processで自分自身が止まる。exit 255で後続が消えた原因と直し方