4

TeamCity Powershell ランナーが .ps1 ファイルを実行すると、Powershell コミュニティ拡張の一部である Write-Zip コマンドが認識されません。

ビルド サーバーで同じコマンドを手動で実行すると、問題なく動作します。TeamCity と私の両方が x64 バージョンの powershell.exe を実行しており、両方が同じユーザーとして実行されていることを確認しました。

[17:21:22][Step 5/5] Packaging WWW.zip
[17:21:45][Step 5/5] Write-Zip : The term 'Write-Zip' is not recognized as the name of a cmdlet, 
[17:21:45][Step 5/5] function, script file, or operable program. Check the spelling of the name, or 
[17:21:45][Step 5/5] if a path was included, verify that the path is correct and try again.
[17:21:45][Step 5/5] At 
[17:21:45][Step 5/5] C:\TeamCity\buildAgent\work\e19b1309c030c7e2\Build\PowerShell\Package.ps1:20 
[17:21:45][Step 5/5] char:1
[17:21:45][Step 5/5] + Write-Zip -InputObject $items -OutputPath .\WWW.zip
[17:21:45][Step 5/5] + ~~~~~~~~~
[17:21:45][Step 5/5]     + CategoryInfo          : ObjectNotFound: (Write-Zip:String) [], CommandNo 
[17:21:45][Step 5/5]    tFoundException
[17:21:45][Step 5/5]     + FullyQualifiedErrorId : CommandNotFoundException
[17:21:45][Step 5/5] 

別の環境から実行されているpowershellに関連している可能性があると思いますが、まだ完全には理解していません。

TeamCity ビルド ログで、スクリプトが次のように実行されていることがわかりました。

 C:\Windows\sysnative\cmd.exe /c C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -ExecutionPolicy ByPass -File C:\TeamCity\buildAgent\work\e19b1309c030c7e2\Build\PowerShell\Package.ps1 -WorkingDirectory C:\TeamCity\buildAgent\work\e19b1309c030c7e

powershell が C:\Windows\sysnative\cmd.exe によって実行されていることに注意してください。

ただし、ビルド サーバーでは、このディレクトリまたは cmd.exe のバージョンが表示されず、PowerShell またはコマンド プロンプトから同じコマンドを実行しようとすると、C:\Windows\sysnative が見つからないと表示されます。 \cmd.exe

TeamCity が実際に Powershell を実行する方法を知っている人はいますか?

アップデート

Command Line Runner を使用して powershell スクリプトを実行し、TeamCity と同じように -File コマンドを使用して powershell.exe を呼び出してみました。

TaskManager を実行していて、それが実行した cmd.exe プロセスが C:\Windows\SysWOW64\cmd.exe であることを確認しました

上記とまったく同じエラーが発生しました。Write-Zip が認識されません。ただし、...\SysWOW64\cmd.exe で同じコマンドを手動で実行すると、機能します。

繰り返しになりますが、TaskManager によると、両方が同じマシンで同じユーザーとして実行されています。

4

3 に答える 3

1

スクリプトに PSCX モジュールをインポートしますか? 一度これを行うと、PowerShell v3 はモジュール情報をキャッシュするため、再度インポートする必要はありません。ただし、TeamCity が 64 ビット コンソールを実行していて、通常は 32 ビット コンソールを実行している場合、64 ビット コンソールのコマンド キャッシュには PSCX コマンドがありません。とにかく、スクリプトが依存するモジュールを明示的に要求することをお勧めします。

#requires -Modules Pscx
于 2013-07-17T16:43:06.570 に答える
1

キースの答えは、私を正しい道へと導きました。

Pscx モジュールのインストールをC:\Program Files (x86)...からC:\Windows\System32\WindowPowerShell\v1.0\Modulesに移動することで、問題を解決できました。

コミュニティ拡張機能がデフォルトで他のすべてのモジュールとともに Modules ディレクトリにインストールされない理由がわかりません。しかし、何らかの理由で、TeamCity は Program Files (x86) ディレクトリにあるモジュールをロードできませんでした

TeamCity から 64 ビット バージョンの powershell を実行していました。この場合、32 ビット (x86) モジュールをロードできないことは理にかなっていますが、実行したときに 64 ビット バージョンの powershell も実行していました。それは手動で、その時はうまくいきました。

そのため、TeamCity がモジュールを認識できなかった理由についてはまだ少し混乱していますが、正しい PowerShell インストールで Modules ディレクトリに移動すると問題が解決しました。

于 2013-07-17T17:46:31.803 に答える
0

これが誰かに役立つかどうかはわかりませんが、私は cmder を開いており、チームシティのエージェントは同じユーザーで実行されていました。何らかの理由で、cmder を開くことで、何らかの理由で powershell をロックしたままにしていました。説明はできませんが、cmder を閉じると問題が解決しました。

于 2016-06-15T18:45:32.977 に答える