Windows コマンド プロンプトで一重引用符を二重引用符として扱うにはどうすればよいでしょうか?

Windows コマンド プロンプトで一重引用符を二重引用符として扱うにはどうすればよいでしょうか?

私のシナリオはシンプルです。マーキュリアルオンラインブックそして、それを Windows コマンド プロンプトに貼り付けます。問題は、この本のサンプルが一重引用符で囲まれた文字列を使用していることです。一重引用符で囲まれた文字列が Windows コマンド プロンプトに渡されると、Windows コマンド プロンプトは一重引用符の間のすべてが 1 つの文字列に属していることを認識しません。

たとえば、次のコマンド:

hg commit -m 'Initial commit'

コマンドプロンプトでは、と の'Initial commit'2 つの文字列として扱われるため、そのままでは貼り付けられません。貼り付け後にコマンドを編集する必要があり、面倒です。'Initialcommit'

Windows コマンド プロンプトに、一重引用符を二重引用符と同様に扱うように指示することは可能ですか?

編集

JdeBP からの返信を受けて、少し調査してみました。要約は次のとおりです。

  • Mercurial のエントリ ポイントは次のようになります (Python プログラムです)。

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • そこで、私は Mercurial で使用されるコマンドライン処理を模倣する小さな Python プログラムを作成しました。

    import sys
    print sys.argv[1:]
    
  • 以下は Unix コンソール ログです。

    [hg@Quake ~]$ python 1.py  "1 2 3"
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  '1 2 3'
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  1 2 3
    ['1', '2', '3']
    [hg@Quake ~]$
    
  • それぞれの Windows コンソール ログは次のとおりです。

    C:\Work>python 1.py  "1 2 3"
    ['1 2 3']
    
    C:\Work>python 1.py  '1 2 3'
    ["'1", '2', "3'"]
    
    C:\Work>python 1.py  1 2 3
    ['1', '2', '3']
    
    C:\Work>
    

Windows では一重引用符を二重引用符として扱わないことは明らかです。これが私の質問の本質です。

答え1

command.com プロンプトでは引用符を変更できません。ただし、引用符として一重引用符と二重引用符の両方を受け入れる PowerShell を使用できます。これらは Unix シェルと同じように機能します。つまり、一重引用符では変数が展開されませんが、二重引用符では展開されます。

引用符の中に引用符を入れると、問題が発生する場合があります。たとえば、Windows コンピューターに strawberry perl をインストールしています。PowerShellperl -e 'print time, "\n" 'で実行すると、次のような出力が表示されます1321375663SCALAR(0x15731d4)。期待どおりに動作させるには、二重引用符をエスケープする必要があります。perl -e 'print time, \"\n\" '

答え2

まず、コマンド プロンプトはコマンド インタープリターではありません。(コマンドプロンプトは表示されるコマンドインタープリター。) 第二に、コマンドインタープリタ、それが発行するプロンプト、そしてWin32コンソールには、何もないこれと関係があります。

Win32 プログラムでは、コマンド ラインを「単語」に分割する作業は、main()それらのプログラムのランタイム ライブラリの領域です。これは、C および C++ 言語のプログラムが引数配列として渡される NUL で終了するマルチバイト文字列です。Unix および Linux では、オペレーティング システムが引数文字列配列に基づいて動作するため、シェルが単語の分割を行います。Win32 では、この処理は行われません。Win32 では、オペレーティング システム自体が引数文字列配列に基づいて動作します。コマンドテール: アシングルコマンドラインで最初に入力した引用符がすべて含まれた長い文字列です。(このコマンド末尾は、ターゲット プログラムに渡される前にコマンド インタープリタによって何らかの処理が行われますが、単語の分割とは関係ありません。

あなたの場合、hgプログラムのランタイム ライブラリは次のコマンド tail で配信されます。

commit -m '最初のコミット'

そのプログラムがコンパイルされたランタイムライブラリは、一重引用符が空白引用符文字であることを知らない。なぜなら、それは慣例ではない. 大会ではのみ二重引用符で囲みます (二重引用符の前にはバックスラッシュが必要です)。

この規約は、最初にプログラムを作成するために使用されたコンパイラに付属するランタイムライブラリに組み込まれています。規約を変更する場合は、再リンクする必要があります。このように実行したい個々のプログラム単一引用符も認識する、独自に作成した特別なランタイム ライブラリを使用します。明らかに、これは非現実的です (これらがすべて Cygwin プログラムでない限り)。

はるかに実用的なアプローチは、すでに行っていることを実行することです。つまり、Windows は Unix ではないことを認識し、使用する前にそれに応じて例を調整します。

答え3

DOS がコマンドを解析する方法は編集できないことは確かです。これは DOS の基本プログラミングに固有のものです。

処理を高速化するために私が思いつく唯一の解決策は、メモ帳ウィンドウを開いたままにして、「検索と置換」を実行し、すべての一重引用符を二重引用符に置き換えることです。そして、そこから DOS にコピーして貼り付けます。

関連情報