JP1で困ったこと

JP1をジョブネットワークとして使っているのだが、
JP1からキックされたジョブを起動するユーザの振舞が
その端末のローカルユーザが動かした振舞と異なるときがある。

今回、JP1でキックしているのは、バッチスクリプトだが、
スクリプトの中でpowershellを読んでおり、
こんな処理を実施している。

powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& { get-content -Encoding UTF8 %FILE1% | Set-Content %FILE2%}”

純粋にFILE1を読み込んで、UTF8にエンコーディングしたものをFILE2として出力しているだけなのだが。。。

FILE1の行数が多すぎると、FILE2に追記されず、ロストされる行がでてくる。

ローカルユーザでの単体テストではそんなことは起きないのだが、
JP1からキックされるとこういうが起きる。
原因はつかみ切れていないが、おそらくパイプ(|)でつないでいるので、
その閾値を超えてしまっているのかもしれない。
(後に、これはPowershellのメモリ割当のせいだと発覚。
2GBがデフォルトなので2GBを超えたデータはロストされてしまっているものと思われる。)

解決策として

powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& {Set-Content %TEMPFILENAME% -Value ‘ ‘}
powershell -NoProfile -ExecutionPolicy Unrestricted -Command “& { get-content %1 -ReadCount 10000 -Encoding UTF8 | Add-Content %TEMPFILENAME%}”

上記のような処理に変更し、10000行ずつ読んでは追記するという形に変更したところ、
データロストが起きなくなった。

全ユーザ共通なら発見できるようなものの、
JP1のユーザだけダメってのが本当に困る!
JP1に組み込むのなんて、開発のほぼ最後の方なので、
もう動作は担保してある前提だから、本当に迷惑な話だ。