2016-09-09 3 views
3

いくつかの環境変数を設定し、wgetを使用してファイルをダウンロードして実行する1つの統合スクリプトを作成する必要があります。bash/shellとPowerShellで動作するスクリプトを書くことはできますか?

Windows PowerShellとbash/shellの両方で実行できるSAMEスクリプトである必要があります。

これは、シェルスクリプトです:

#!/bin/bash 
# download a script 
wget http://www.example.org/my.script -O my.script 
# set a couple of environment variables 
export script_source=http://www.example.org 
export some_value=floob 
# now execute the downloaded script 
bash ./my.script 

これはPowerShellで同じものである:

wget http://www.example.org/my.script -O my.script.ps1 
$env:script_source="http://www.example.org" 
$env:some_value="floob" 
PowerShell -File ./my.script.ps1 

何とかこれら2つのスクリプトをマージすることができ、どちらのプラットフォーム上で正常に実行された場合ので、私は疑問に思いますか?

私はそれらを同じスクリプトに入れ、bashとPowerShell.exeにエラーを無視させる方法を見つけようとしていますが、成功していません。

推測できますか?

+2

これは読んでいますか? http://stackoverflow.com/questions/17510688/single-script-to-run-in-both-windows-batch-and-linux-bash – idjaw

+1

PowerShell v6-alpha –

+1

Wowを使用することができますそれは印象的です。 bashを入手してWindows 10の最新バージョンを入手すれば、あなたの問題も解決できるでしょうか? –

答えて

7

可能です。私はこれがどれほど互換性があるのか​​わかりませんが、PowerShellは文字列をテキストとして処理して画面に表示し、Bashはそれらをコマンドとして扱い、それらを実行しようとしますが、どちらも同じ関数定義構文をサポートしています。したがって、関数名を引用符で囲み、Bashだけがそれを実行し、 "exit"を引用符で囲み、Bashだけが終了します。その後、PowerShellコードを書きます。

NB。これは両方のシェルの構文が重なり、スクリプトが単純なためです。コマンドを実行して変数を処理します。いずれかの言語でより高度なスクリプト(if/then、for、switch、caseなど)を使用しようとすると、もう1つは恐らく不平を言うでしょう。

保存この

ので、PowerShellはそれに満足して dual.ps1として、 chmod +x dual.ps1のでbashはどちらのシステム上でそれ

#!/bin/bash 

function DoBashThings { 
    wget http://www.example.org/my.script -O my.script 
    # set a couple of environment variables 
    export script_source=http://www.example.org 
    export some_value=floob 
    # now execute the downloaded script 
    bash ./my.script 
} 

"DoBashThings" # This runs the bash script, in PS it's just a string 
"exit"   # This quits the bash version, in PS it's just a string 


# PowerShell code here 
# -------------------- 
Invoke-WebRequest "http://www.example.org/my.script.ps1" -OutFile my.script.ps1 
$env:script_source="http://www.example.org" 
$env:some_value="floob" 
PowerShell -File ./my.script.ps1 

その後、

./dual.ps1 

を実行します。


編集:あなたは、それは(通常のセキュリティの警告がevalのに適用されます)独自のコードから、各言語のフィルタを有し、かつeval、個別の接頭辞でコードブロックをコメントすることで、より複雑なコードを含むことができ、例えばこのアプローチでは(Harry Johnstonの提案を組み込んで)

#!/bin/bash 

#posh $num = 200 
#posh if (150 -lt $num) { 
#posh write-host "PowerShell here" 
#posh } 

#bash thing="xyz" 
#bash if [ "$thing" = "xyz" ] 
#bash then 
#bash echo "Bash here" 
#bash fi 

function RunBashStuff { 
    eval "$(grep '^#bash' $0 | sed -e 's/^#bash //')" 
} 

"RunBashStuff" 
"exit" 

((Get-Content $MyInvocation.MyCommand.Source) -match '^#posh' -replace '^#posh ') -join "`n" | Invoke-Expression 
+1

'eval'文を関数ブロックに入れてbashだけが実行できるようにして、2つのソリューションを組み合わせることができますか? –

+0

@HarryJohnston私は2番目のスクリプトを再試行しましたが、私は 'eval'で引用符を壊してしまったので動作しませんでした。はい、2つのアプローチを組み合わせることをお勧めします。 - 引用符を変更した理由を修正して、よりうまく動作するようにしています。ありがとうございます。(PowerShellは "$(eval)"を評価しようとしていて、不平を言っていましたが、呼び出されない関数の中にあるときはそうしません)。 – TessellatingHeckler

関連する問題