PowerShellの仕様変更
PowerShellはWindowsのシェル的存在だったが、いまではオープンソースになってmacOS, Linuxでも使えるようになっている。
もちろんそこで使えるコマンド類はプラットフォーム固有のものになるが、最近ではオープンソースのコマンド類が増えたので、同じスクリプトで同じ動作と言うことを実現するのも難しくない。
Windowsでファイルをバックアップしたり、移動したりする目的でrobocopyというコマンドを使うことがある。
NASの4台で組んだRAID5のドライブうち1台の調子が悪くなり、ほとんど冗長性を失った状態になった。
そのNASの調子自体がある種のバックアップ的存在だったが、「まとめてあるのはそこだけ」というファイル群も少なくなかった。
緊急に外付けHDDを用意して、Windowsからrobocopyでバックアップを取ることにした。
そのNASはWindows上ではネットワークドライブとして登録してあるので、
robocopy ネットワークドライブのパス(例えばD:\) バックアップ先のパス /s
とやれば/sコマンドのオプションでそれ以下のサブディレクトリがすべてコピーされるはずだ。
ところが「エラー 3 (0x00000003) コピー元ディレクトリにアクセスしています 指定されたパスが見つかりません。」というエラーが帰ってきて一向にコピーできない。
そこで分かったのがPowerShellにおいて
Windows上でのネットワークドライブ指定は無効
という驚くべき仕様変更だった。
だから
robocopy ネットワークドライブのURL(例えば\\192.168.1.12) バックアップ先のパス /s
と言う風にしなくてはいけないのだ。
つまりネットワークドライブのようなプラットフォーム依存のリソースロケーターは無効化されたと言うことだろう。