質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

lhaplusをpowershellで呼び出して、フィアルを解凍したい。

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,168

jimuma

score 14

 前提・実現したいこと

仕事で複数の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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+2

何を使うのが良いのかはさておき、とりあえずエラーの原因について。

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はすでに指定されているため、/odArgumentListパラメータに対する指定として解釈されます。
/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には日本語ヘルプが同梱されています)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/06 22:40

    有難うございます!お蔭様で意図通りに動いただけではなく、理解も深まりました!

    キャンセル

  • 2018/09/06 22:41

    有難うございます!お蔭様で意図通りに動いただけではなく、理解も深まりました!

    キャンセル

+1

Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" -ArgumentList /od,C:\work\test\test.zip


試したところ私の場合は上のコマンドで展開できました。

参考
Start-Processを使って外部プログラムの引数がうまく扱えない・・・

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 21:55

    有難うございました!
    「,(カンマ)」で区切れば良かったんですね!

    キャンセル

+1

powershellにおけるStart-Processの構文は以下の通りです。

Start-Process [-FilePath] <string> [[-ArgumentList] <string[]>]  [<CommonParameters>]

ご質問の内容は、以下のように-ArgumentListを明示してあげることで上手く動くと思います。

Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" -ArgumentList "/oh", "C:\work\test\test.zip"

しかし、ArgumentList引数に渡されたstring配列はコマンド解釈の時点で単純に一つの文字列として結合されるようで、配列のままプロセスに渡されるわけではないようです。
つまり、引数部分はわざわざ「,(カンマ)」区切りのstring配列にするのではなく、以下のように引数部分も半角スペース区切りの1つの文字列にしてしまった方が良いようです。

Start-Process -FilePath "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" -ArgumentList "/oh C:\work\test\test.zip"

本件が特に問題になるのは、出力ファイル名等に半角スペースを含む場合です。
このような場合には、前述の方法では意図した通りに動いてくれません。
Windowsの仕組みに起因するようなので、後者の記述にしておく方が無難なようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 21:54

    有難うございました!
    Powershellの概要を理解出来ていなかったので少し理解が困難でしたが、大変助かりました。

    キャンセル

+1

Start-Processではなく&(呼び出し演算子)を使うのはどうでしょうか。

& "C:\Program Files (x86)\Lhaplus\Lhaplus.exe" /od C:\work\test\test.zip

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/06 22:39

    呼び出し演算子でも出来るんですね。勉強になります。有難うございます。

    キャンセル

0

CUIで実行するなら7zipかなんかで解凍したほうが良くないですか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 21:55

    仕事場の事情でLhaplusで解凍する必要があります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる