質問: ### 前提・実現したいこと 仕事で複数のgz形式のファイルをlhaplusを使い解凍したいのですが上手くいかないので、先ずは「powershellでlhapulusを呼び出し、1つのzipファイルを解凍」したいと考えています。 ネットで調べながら進めていますが上手くいかないので詳しい人がいたら教えて下さい。 宜しくお願いします。 ### 発生している問題・エラーメッセージ ``` Start-Process : 引数 'C:\work\test\test.zip' を受け入れる位置指定パラメーターが見つかりません。 発生場所 行:1 文字:14 + Start-Process <<<< -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /od "C:\work\test\test.zip" + CategoryInfo : InvalidArgument: (:) [Start-Process]、ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand ``` ### 該当のソースコード ``` Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /od C:\work\test\test.zip ``` ### 試したこと 1,管理者権限でpowershellを起動しているのでポリシーに関するエラーは出ていません。 2,「C:\work\test」には「test.zip」ファイルを配置してあります。 3,上記に記載の通りですが、Lhaplusの実行パスは半角スペースが含まれているので「"」で囲っています。 4,コマンドプロンプトで「"C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /oh C:\work\test\test.zip」とすると正しく実行出来ました。 5,「-FilePath」は記述しても削除しても同症状です。 6,オプションを省き「Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe"」だけで実行すると、lhaplusが起動します。 ### 補足情報(FW/ツールのバージョンなど) PSVersion 2.0 OS win7 professional
回答: 何を使うのが良いのかはさておき、とりあえずエラーの原因について。 PowerShellの基本として、コマンドレットにパラメータを渡したとき、パラメータを明示しない場合は「位置指定パラメーター」として解釈されます。 パラメータの区切りは半角スペースです。 ``` Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /od C:\work\test\test.zip ``` を実行した場合、 `FilePath`パラメータとして `"C:\Program Files (x86)\Lhaplus\Lhaplus.exe"` 位置指定パラメーターとして `/od`および`C:\work\test\test.zip`が渡されたと解釈されます。 Start-Process コマンドレットのドキュメントを見てみると、位置指定パラメータで指定できるのは`FilePath`パラメータ及び`ArgumentList`パラメータです。 `Position`の欄に数字が入っているものが位置指定パラメータとして使えるもので、数字の小さい順に指定されたと解釈されます。 これを踏まえて渡されたパラメータを見てみると、`FilePath`はすでに指定されているため、`/od`は`ArgumentList`パラメータに対する指定として解釈されます。 `/od`の時点で位置指定パラメータを使い切ってしまうため、 残った `C:\work\test\test.zip` を受け入れる位置指定パラメーターが見つからない ということになります。 今回は`/od C:\work\test\test.zip`全体をコマンドライン引数として指定したいため、修正すると以下のような感じでしょうか。 わかりやすいように変数に分離しましたが、直接書いてしまっても大丈夫です。 ``` [string]$lhaplusExe = 'C:\Program Files (x86)\Lhaplus\Lhaplus.exe' [string]$lhaplusArgs = '/od C:\work\test\test.zip' Start-Process -FilePath $lhaplusExe -ArgumentList $lhaplusArgs ``` PowerShell 2.0なら日本語化されたヘルプがあり、量もたかがしれているのでチュートリアル部分とaboutトピックは一通り目を通しておくとよいと思います。 私が上に書いた話も about_Parameters に記載されています(リンク先は英語ですが、PowerShell 2.0には日本語ヘルプが同梱されています)。