4

さて、ゲームボーイから離れているときにポケモンのバックアップをロードするために使用するbatファイルを作成しましたが、Linuxに変換したため、exeで.BATファイルを取得する際に問題が発生しました(I' exe をソースに逆コンパイルして .SH として動作するようにしましたが、シェル コマンドを BAT ファイルと同じ機能として使用する方法についてはあまり見つけることができません :/ また、方法を知りたいです。 SHファイルを現在のディレクトリからロードするように設定し、そのプログラムをwineで実行します。

これは私の.BATファイルで、Windowsでは100%完全に動作しますが、wineやwineで移植可能なCMDプロンプトでは実行できません

`:MENU
CLS

ECHO ============= RawX GBA's =============
ECHO -------------------------------------
ECHO 1.  Pokemon Crystal
ECHO 2.  Pokemon Green
ECHO 3.  Pokemon Gold
ECHO 4.  Pokemon Pikachu
ECHO 5.  Pokemon Ruby
ECHO 6.  Pokemon Chaos Black
Echo 7.  Pokemon Silver
ECHO 8.  Pokemon White (NDS)
ECHO 9.
Echo 10.
Echo 11.
Echo 12. Pokemon Black (NDS)
ECHO ==========PRESS 'Q' TO QUIT==========
ECHO.
color fc

SET INPUT=
SET /P INPUT=Please select a number:

IF /I '%INPUT%'=='1' GOTO Selection1
IF /I '%INPUT%'=='2' GOTO Selection2
IF /I '%INPUT%'=='3' GOTO Selection3
IF /I '%INPUT%'=='4' GOTO Selection4
IF /I '%INPUT%'=='5' GOTO Selection5
IF /I '%INPUT%'=='6' GOTO Selection6
IF /I '%INPUT%'=='7' GOTO Selection7
IF /I '%INPUT%'=='8' GOTO Selection8
IF /I '%INPUT%'=='9' GOTO Selection9
IF /I '%INPUT%'=='10' GOTO Selection10
IF /I '%INPUT%'=='11' GOTO Selection11
IF /I '%INPUT%'=='12' GOTO Selection12
IF /I '%INPUT%'=='Q' GOTO Quit

CLS

ECHO ============INVALID INPUT============
ECHO -------------------------------------
ECHO Please select a number from the Main
echo Menu [1-9] or select 'Q' to quit.
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE > NUL
GOTO MENU

:Selection1

:1
".\VisualBoyAdvance.exe"  ".\Pokemon Crystal.zip"
goto menu

:Selection2

:2
".\VisualBoyAdvance.exe"  ".\Pokemon Green.zip"
goto menu

:Selection3

".\VisualBoyAdvance.exe"  ".\Pokemon Gold.zip"
goto menu

:Selection4

".\VisualBoyAdvance.exe"  ".\Poke'mon Pikachu.zip"
goto menu

:Selection5

".\VisualBoyAdvance.exe"  ".\Pokemon Ruby.zip"
goto menu

:Selection6

".\VisualBoyAdvance.exe"  ".\Pokemon - Chaos Black.zip"
goto menu

:Selection7

".\VisualBoyAdvance.exe"  ".\Pokemon Silver.zip"
goto menu


:Selection8

".\desmume.exe"  ".\PokeWhite.zip"
goto menu

:Selection12

".\desmume.exe"  ".\PokeBlack.zip"
goto menu






:Quit
CLS

ECHO ==============THANK YOU===============
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE>NUL
EXIT`
4

1 に答える 1

19

Bourne シェルへの変換は非常に簡単です。

  1. #!/bin/shLinux に使用するインタープリターを指示するために、最初の行にまたは同様の行を追加します。Windows とは異なり、複数のコマンド シェルがあり、シェルだけでなくスクリプト インタープリターも多数あります。

  2. cmd.exeコマンドに相当するものはCLSLinuxclearにあります。

  3. Linux では大文字と小文字が区別ECHOされるため、すべての s は小文字にする必要があります。あなたのIF発言を翻訳版のままにしておけば、それらも小文字にしなければならなかったでしょう。

  4. echoシェルスクリプトでは、のようにすべてを文字どおり行末まで出力するだけではありませんcmd.exe。Bourne シェルはよりリッチな言語です。コマンドに送信する前に、コマンドの後に表示される内容に意味を適用できます。コードでは、一重引用符 ( ') と複数のスペースは、このコマンド処理に耐えられません。

    この種の問題を避けるために、すべてのecho文字列を二重引用符で囲みました。問題のある文字列のみを二重引用符で囲んで選択的に実行することもできましたが、一貫性を保つためにすべてを二重引用符で囲むことにしました。echoBourne シェルでは二重引用符が必要であるという誤った考えを理解してほしくありません。

    バッチ ファイルとシェル スクリプトの間の 1 対 1 の対応を確認できるように、変換を単純にすることに関心がない場合は、echoコマンドの 2 つの大きなブロックをヒアドキュメントに置き換えます。

  5. echo.echoボーンシェルだけです。echoBourne シェルでは、 のようにコマンド エコーのオンとオフを切り替えるためにオーバーロードされないため、Bourne シェルではECHO ON/OFFドットは必要ありませんcmd.exe。(Bourne シェルには同様の機能があり、 で有効になりset -xます。)

  6. Bourne シェルでカラー出力を取得することは可能ですが、 のような単純な組み込みコマンドはありませんcmd.exe。きれいな色のメニューが必要な場合は、このスクリプトのコードの多くを への呼び出しに置き換えることができますdialog(1)

  7. readシェルスクリプトで入力を取得するために使用します。set他のことをします。

  8. gotoボーンシェルにはありません。Bourne シェルには適切な制御構造があるため、必要ありません。ステートメントは内側の選択コードの意図を表し、無限ループは外側の「ヒットするまでこれをやり続ける」スキームを表すcaseと思います。whileq

  9. コード フローが最後の「続行するには任意のキーを押してください」ビットに到達する方法がわからないため、削除しました。私が間違っていれば、おおまかに相当するのPAUSEは ですread -n 1 -s

  10. 外部プログラムへの呼び出しを変更し、Linux での処理方法に合わせてを削除して.exeに変更.\しました。./と に相当する Linux を考え出す必要がVisualBoyAdvance.exeありdesmume.exeます。

結果は次のようになります。

#!/bin/sh
clear

while true do
    echo "============= RawX GBA's ============="
    echo "-------------------------------------"
    echo "1.  Pokemon Crystal"
    echo "2.  Pokemon Green"
    echo "3.  Pokemon Gold"
    echo "4.  Pokemon Pikachu"
    echo "5.  Pokemon Ruby"
    echo "6.  Pokemon Chaos Black"
    echo "7.  Pokemon Silver"
    echo "8.  Pokemon White (NDS)"
    echo "9."
    echo "10."
    echo "11."
    echo "12. Pokemon Black (NDS)"
    echo "==========PRESS 'Q' TO QUIT=========="
    echo

    echo -n "Please select a number: "
    read input

    case $input in
        1)
            ./VisualBoyAdvance "Pokemon Crystal.zip"
            ;;

        2)
            ./VisualBoyAdvance "Pokemon Green.zip"
            ;;

        # etc.

        q)
            clear
            exit

        *)
            clear
            echo "============INVALID INPUT============"
            echo "-------------------------------------"
            echo "Please select a number from the Main"
            echo "Menu [1-12] or select 'Q' to quit."
            echo "-------------------------------------"
            echo "======PRESS ANY KEY TO CONTINUE======"
    esac
done
于 2013-07-28T00:41:10.637 に答える