「クイックスタート-Windowsでプログラム可能-環境の設定」を習得し、簡単なスクリプトを記述した経験があることを前提としています。 そして私は嘘をついた。 ターゲットマシンには、 Microsoft Visual C ++が必要な場合があります 。
最初に、単純なスクリプトをGoアプリに変換しようとします。 たとえば、 test.batを使用します。
@echo off set URL1="ftp://user:pass@88.88.88.88/test.zip" set URL2="ftp://user1:pass1@99.99.99.99/exchange/test.zip" set SAVE_PATH=".\test\test.zip" echo curl %URL1% -o %SAVE_PATH% if %errorlevel% NEQ 0 ( echo : %errorlevel% curl %URL2% -o %SAVE_PATH% )
マイクロソフトへの愛の瞬間。 ファイルが2番目のソースからダウンロードされたかどうかを確認したい場合は、 GOTOを使用する必要があります。これは、 IFおよびFORの内部で、 errorlevel%および%time%がIFおよびFORを呼び出す前と同じであるためです
Goスクリプトは次のようになります。
package main import ( "fmt" "os" "os/exec" ) func main() { url1 := "ftp://user:pass@88.88.88.88/test.zip" url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip" out_file := ".\\test\\test.zip" // Go , windows . err := start_curl(url1, out_file) if err != nil { fmt.Printf(" : %v\r\n", err) err = start_curl(url2, out_file) if err != nil { fmt.Printf(" : %v\r\n", err) os.Exit(1) } } fmt.Printf(" \r\n") } func start_curl(url string, out_file string) error { cmd := exec.Command("curl", url, "-o", out_file) err := cmd.Run() return err }
ローンチを開始しましたが、デバッグのために、stderr / stdoutでcurlが生成するものを見るといいでしょう。 ところで、curlはすべてをstderrに表示します。
func start_curl(url string, out_file string) error { cmd := exec.Command("curl", url, "-o", out_file) //cmd.Stdout = os.Stdout // . cmd.Stderr = os.Stderr err := cmd.Run() return err }
エラーの場合、start_curl()関数は「exit code 7」のようなものを返します。 そして、数値の形式で戻りコードを受け取りたいです。 文字列「exit_code」を切り取り、文字列「7」を数値7に変換できます。 これを行うには、文字列とstrconvパッケージをインポートする必要があります。 しかし、より単純で、あまり明確ではない方法があります。
package main import ( "fmt" "os" "os/exec" "syscall" ) func main() { url1 := "ftp://user:pass@88.88.88.88/test.zip" url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip" out_file := ".\\test\\test.zip" int_err := start_curl(url1, out_file) if int_err != 0 { fmt.Printf(" : %d\r\n", int_err) int_err = start_curl(url2, out_file) if int_err != 0 { fmt.Printf(" : %d\r\n", int_err) os.Exit(int_err) } } fmt.Printf(" \r\n") } func start_curl(url string, out_file string) int { var exit_code int cmd := exec.Command("curl", url, "-o", out_file) //cmd.Stdout = os.Stdout //cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { exit_code = int(err.(*exec.ExitError).Sys().(syscall.WaitStatus).ExitCode) } else { exit_code = 0 } return exit_code }
今日は以上です。 コンパイラは、完成したexeファイルを収集します。 大きなサイズ(数メガバイト)を恐れる必要はありません。 最小ランタイムおよびすべての必要なパッケージは、このファイルに収集されます。 Goアプリのメモリ消費量は、perlやpythonの半分です(もちろん、小さなアプリケーションについて説明している場合を除きます)。 誰かがこの記事に興味を持っている場合は、コメントで私が検討したいトピックを示してください。
- テキストの処理(標準出力、エンコードの解析)
- ファイル(情報、検索、ロギング)
- winapiでの作業(dllの接続、関数の呼び出し、応答の処理)
- adodbを操作する(MSAccessデータベースからデータを読み取る方法)
- Goを使用して電子メールを送信する
- シンプルなrpcサーバー