🐥
無限ループで作ったフォルダが消せない
経緯
定期バックアップをするため、Robocopyを使ったフォルダをコピーするバッチを作成し動作を確認したところ、無限ループが発生した。
@echo off
mkdir .\test\test1
Robocopy E:\SysinternalsSuite-ARM64 .\test\test1\ /MIR
pause
ミラーリングオプションがついているのにも関わらず下記指定をしてしまったことが原因。
- コピー先のパスをカレントを選んでていたこと。
- コピー元をカレントにして、バッチを実行してしまったこと。
原因がわかり、テスト環境を元に戻すべく作成された無用なフォルダを削除したが、エラーメッセージが出て削除できなかった。何故か。
E:\SysinternalsSuite-ARM64>rmdir /S /Q test
test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\test\test1\accesschk64a.exe - 指定されたパスが見つかりません。
理由
- パスの最大長の制限があるから
Windows API では (次の段落で説明するいくつかの例外を除いて)、パスの最大長は MAX_PATH です。この値は 260 文字と定義されています。ローカル パスの構成は、ドライブ文字、コロン、円記号、円記号で区切られた名前コンポーネント、終端の null 文字という順序です。たとえば、ドライブ D の最も長いパスは "D:\256 文字のパス文字列<NUL>" です。"<NUL>" は現在のシステム コードページに対する非表示の終端 null 文字を表します。
削除の仕方
- "\\?\" プレフィックスを使用する
E:\SysinternalsSuite-ARM64>rmdir /s \\?\E:\SysinternalsSuite-ARM64\test\
\\?\E:\SysinternalsSuite-ARM64\test\、よろしいですか (Y/N)? y
E:\SysinternalsSuite-ARM64>dir test
ドライブ E のボリューム ラベルは ボリューム です
ボリューム シリアル番号は 3648-DFF4 です
E:\SysinternalsSuite-ARM64 のディレクトリ
ファイルが見つかりません
- GUIで削除する
結論
GUI最強
Discussion