none
バッチ実行時にパラメーターが正常に渡されない? RRS feed

  • 質問

  • お世話になります。

    OSはXPでC#2008 SP1を使用しています。

     

    やりたい事:

    expand " C:\\Documents and Settings\\Administrator\\My Documents\\a.cab" -f:* "C:\\CatBinder\\"

     

    プログラム実行:

    expand \ " C:\\Documents and Settings\\Administrator\\My Documents\\a.cab\ " -f:*  \ "C:\\CatBinder\\\ "

     

    System.Diagnostics.ProcessStartInfoを使用したバッチ実行の結果:

    Microsoft (R) File Expansion Utility  Version 5.1.2600.0\r\nCopyright (C) Microsoft Corp 1990-1999.  All rights reserved.\r\n\r\nc:\\documents and settings\\administrator\\my documents\\a.cab: マルチファイル CAB には展開先のディレクトリが必要です。\r\n\r\n

    「”」を入れると@””””でも"\""でも文字コード指定でも「\r\n」をリプレイスしても必ず「”¥」となるのですが、回避方法はあるのか、初歩的な質問で申し訳ないですがご教授頂ければ幸いです。

    #DOSプロンプトで赤字の部分を削除して手動実行した場合、正常に完了した事を見ると、¥が余計に入ったのが原因と見ています。

    2010年5月30日 12:25

回答

  • >psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");

    どうしてコマンドプロセッサ経由で間接的に実行してるんでしょう?

    expand を呼び出すだけなら、expand を FileName にしていして、前回提示のコマンドライン文字列を Arguments に指定すればおkだと思います。

    どうしてもコマンドプロセッサ経由で expand を呼び出したいなら、さらに一重、引用符で Arguments を括ってやらないとダメな気がします。

    • 回答としてマーク 穂樹 2010年5月31日 5:29
    2010年5月30日 16:12
    モデレータ

すべての返信

  • string commandline = @"expand ""C:\Documents and Settings\Administrator\My Documents\a.cab"" -f:* ""C:\CatBinder\""";

    でダメです?

    2010年5月30日 14:09
    モデレータ
  • 渋木宏明  

    返信、ありがとうございます。ベタ打ちでやってみましたが残念ながら同じエラーがでました。

    WIN7の環境でも同じく”¥””で「”」を入れると「¥”」になるのに「¥’」だと真面目に「’」だけになってくれます。

     

    コマンド生成時のソース:

    StrCommandLine = "expand " + @"""" + pStrCmdArgs.ToString().Trim() + @"""" + " -f:* " + @"""" + rSctPara.GetDragPath.ToString().Trim() + @"""";

    • 編集済み 穂樹 2010年5月30日 15:52
    2010年5月30日 15:49
  • そもそも、そのコマンドライン文字列をどうやって実行しようとしてます???
    2010年5月30日 15:51
    モデレータ
  • 説明不足で申し訳ありません、ソースは以下になります。

     

    //StrCommandLine = "expand " + @"""" + pStrCmdArgs.ToString().Trim() + @"""" + " -f:* " + @"""" + rSctPara.GetDragPath.ToString().Trim() + @"""";

    StrCommandLine = @"expand ""C:\Documents and Settings\Administrator\My Documents\a.cab"" -f:* ""C:\CatBinder\""";


    Lib_Files.DosComand(StrCommandLine.ToString());

    --------------------------------------------------------------

    DosComandの中身

            public static void DosComand(string pStrDosPara)
            {
                try
                {
                    System.Diagnostics.ProcessStartInfo psi =
                        new System.Diagnostics.ProcessStartInfo();

                    //ComSpecのパスを取得する
                    psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");

                    //出力を読み取れるようにする
                    psi.RedirectStandardInput = false;
                    psi.RedirectStandardOutput = true;
                    psi.UseShellExecute = false;
                    //ウィンドウを表示しないようにする
                    psi.CreateNoWindow = false;
                    //コマンドラインを指定("/c"は実行後閉じるために必要)
                    psi.Arguments = @"/c " + pStrDosPara;
                    //起動
                    System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
                    //出力を読み取る
                    string StrResults = p.StandardOutput.ReadToEnd();
                    //WaitForExitはReadToEndの後である必要がある
                    //(親プロセス、子プロセスでブロック防止のため)
                    p.WaitForExit();

                    Console.WriteLine(StrResults); ← 上記貼り付けたエラーの取得部分

                }catch(Exception Ex){
                    //エラーログ
                    LogOutPut("",Ex);               
                }
            }

    2010年5月30日 15:59
  • >psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");

    どうしてコマンドプロセッサ経由で間接的に実行してるんでしょう?

    expand を呼び出すだけなら、expand を FileName にしていして、前回提示のコマンドライン文字列を Arguments に指定すればおkだと思います。

    どうしてもコマンドプロセッサ経由で expand を呼び出したいなら、さらに一重、引用符で Arguments を括ってやらないとダメな気がします。

    • 回答としてマーク 穂樹 2010年5月31日 5:29
    2010年5月30日 16:12
    モデレータ
  • 渋木宏明 様

    返信、有難うございます。
    結局は以下の通りで実行できましたが、色々と調べていく内に正規の実行方法ではない事がわかりました。
    (この実行方法は元々、VBで似たような事をやっていたので単純に共通で作ったソースを移植していました。)

    @"expand """ + pStrCmdArgs.ToString().Trim() + @""" -f:* """ + rSctPara.GetDragPath.ToString().Trim() + @"\ """

    ※¥が何故抜けていたのかは不明。

    という事でソースを書き換えて間接的な実行をやめる事にしました。
    実行例を示して頂けなかったら暫く悩んでいたと思います、有難うございます。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46581&forum=36


    変更部分
    ------------------------------------------------------------------------

                    StrCommandLine.FileName = "expand";
                    StrCommandLine.Para01 = @"expand """ + pStrCmdArgs.ToString().Trim() + @""" -f:* """ + rSctPara.GetDragPath.ToString().Trim() + @"\""";
                    StrCommandLine.Flg = 1;

            public static void DosComand(gDosCommandProperty pStrDosPara)
            {
                try
                {
                    System.Diagnostics.ProcessStartInfo psi =
                        new System.Diagnostics.ProcessStartInfo();

                    
                    if (pStrDosPara.Flg == 0)
                    {
                        //ComSpecのパスを取得する
                        psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
                        //コマンドラインを指定("/c"は実行後閉じるために必要)
                        psi.Arguments = @"/c " + pStrDosPara.FileName;
                    }
                    else
                    {
                        psi.FileName = pStrDosPara.FileName;   //起動するアプリケーションを指定
                        psi.Arguments = pStrDosPara.Para01;    //その際に引き渡すファイルを指定
                    }
    2010年5月31日 5:28