Windows 8.1 から 10 にアップグレードして約2週間、ほとんどそのままの環境で使えています。支障が出たのが自作のファイル バックアップ スクリプトで、PowerShell から robocopy.exe を呼び出すときにエラーになりました。Windows 8.1 の PowerShell までは、バッドノウハウの一種なのでしょうが経験的に、外部プログラムに引数を渡すときに空白区切りの文字列にすれば動いていたのでした。
古いスクリプトの引数の渡し方(文字列による独自手法)は、こんな感じ:
$prms = """C:\org\documents""" + " " + """D:\bak\documents""" + " " + "/S" + " " + "/XD ""cache"" ""cache2""";
cmd /c robocopy $prms;
Windows 10 の PowerShell で動くように書きなおした現在のスクリプトは、こんな感じ:
$prms = ( """C:\org\documents""", """D:\bak\documents""", "/S", "/XD", """cache""", """cache2""" );
robocopy $prms;
配列に外部プログラムへの引数を入れて、そのまま渡しています。新しい方も、経験的に動くという手法ですが、多少は正統的な感じがしませんか?
ところで、PowerShell のバージョンですが、Windows 8.1 では、
PS C:\> $PSVersionTable
Name |
Value |
---- |
----- |
PSVersion |
4.0 |
WSManStackVersion |
3.0 |
SerializationVersion |
1.1.0.1 |
CLRVersion |
4.0.30319.34209 |
BuildVersion |
6.3.9600.17400 |
PSCompatibleVersions |
{1.0, 2.0, 3.0, 4.0} |
PSRemotingProtocolVersion |
2.2 |
Windows 10 では、
PS C:> $PSVersionTable
Name |
Value |
---- |
----- |
PSVersion |
5.0.10240.16384 |
WSManStackVersion |
3.0 |
SerializationVersion |
1.1.0.1 |
CLRVersion |
4.0.30319.42000 |
BuildVersion |
10.0.10240.16384 |
PSCompatibleVersions |
{1.0, 2.0, 3.0, 4.0...} |
PSRemotingProtocolVersion |
2.3 |
となっていました。つまり、Windows 8.1 は PowerShell 4.0 で、Windows 10 は PowerShell 5.0 ということになります。スクリプトが動かなくなったということは、どこかが、微妙に異なっているのですね。
(2015/9/1)