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つも残っていません。

参考

切り離したPowerShellは、文字コードでも黙って失敗していました。
Claude Codeが書いた.ps1が文字化けして動かない(PowerShell 5.1)。先頭にBOMを付けたら直った

切り離した処理を止めようとして、自分まで止めた話もあります。
PowerShellのStop-Processで自分自身が止まる。exit 255で後続が消えた原因と直し方

記事URLをコピーしました