PowerShellの動作がWindows 10で若干変更

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)