2016-05-01 4 views
0

私はConvertFrom-JsonでキャプチャしたいJSONを吐き出すpythonスクリプトを持っています。残念ながら、このスクリプトでは、実行する前に別のディレクトリに移動する必要があります。これを行うための慣習的なパワーシェルの方法は何ですか?

これは動作します:

$q = powershell.exe -Command "cd some\other\dir; python JsonMaker.py | ConvertFrom-Json" 

これがそうであるように:

$cwd=Get-Location 
cd some\other\dir 
$q=python JsonMaker.py | ConvertFrom-Json 
cd "$cwd" 

しかし、現在の作業ディレクトリを変更すると、私にはdicey思える - Pythonスクリプトは、不正な形式のJSONを出力した場合、私は中に残されますどのようなsome\other\dir? UNIXシェルスクリプトの世界で

、私は明らかに

(cd some/other/dir && python JsonMaker.py) | commandThatUsesJson 

または$(cd some/other/dir && python JsonMaker.py)とで入力を読み込むような何かをしたいです。しかし、UNIXのサブシェルは安価です。 PowerShellでは、私はサブシェルの開始に目立った遅れがあることを知っています。

Powershellの長年のユーザーがこれに似たアプローチは何ですか?

+0

いくつかのメモ。 1)Powershellの現在の作業ディレクトリ(CWD)が必ずしもファイルシステムにあるとは限りません。 2)CWDはスコープの一部ではないので、CWDを復元するために子スコープの出口を使うことはできません。3) 'cd fileSystemPath -UseTransaction'(少なくともPS 3)が機能しないため、CWDを復元するためにトランザクションを使用することはできません。 4)pushd/popdは最高の選択肢のようです。 5) '-ErrorAction stop'を指定して' ConvertFrom-Json'を実行し、try/finallyに入れて、JSONの変換の問題から回復できることを確認することもできます。 –

答えて

0

python.exe JsonMaker.pyは、子プロセスとして実行されます。子プロセスの現在のディレクトリに対する変更は、親には影響しません。 ConvertFrom-Jsonはカレントディレクトリにも影響しません。これは、JSON文字列がJSONデータを表すオブジェクトに変換するか、JSON文字列が不正な場合に(終了しない)エラーをスローします。

あなたは、安全側にtryブロックで変換を実行し、そのブロックの後に一時作業ディレクトリから復帰する文を入れたい場合は:

try { 
    $q = python JsonMaker.py | ConvertFrom-Json 
} catch { 
    # error handling (optional) 
} 

cd "$cwd" 

またはfinally句の:

try { 
    $q = python JsonMaker.py | ConvertFrom-Json 
} catch { 
    # error handling (optional) 
} finally { 
    cd "$cwd" 
} 

他の人がすでに述べたように、私は変るの簡単な方法としてPush-LocationPop-Location(またはそのエイリアスpushdpopd)を使用したいですgを別の作業ディレクトリにコピーし、元のディレクトリに戻します。コマンドレットは、Unixのシェルコマンドpushdおよびpopdと同様に動作します。

私はまた、意図せずに同じベース名(例えばpython.cmdまたはpython.com)と異なる実行可能ファイルを実行するとcall operator&)を使用しないように(実行ファイル名に拡張子を追加することをお勧めしたいです。新しいpowershell.exeプロセスでコマンドを実行する必要はなく、オブジェクト自体ではなくJSON文字列から作成したオブジェクトの文字列表現だけを返します。これはおそらくあなたが望むものではありません。


修正コード:

try { 
    Push-Location 'D:\some\other\dir' -ErrorAction Stop 
    $q = & python.exe JsonMaker.py | ConvertFrom-Json 
} catch { 
    # error handling (optional) 
} finally { 
    Pop-Location 
} 
Push-Location 'D:\some\other\dir' 

try { 
    $q = & python.exe JsonMaker.py | ConvertFrom-Json 
} catch { 
    # error handling (optional) 
} finally { 
    Pop-Location 
} 

たり、条件付きで、ディレクトリを変更することに成功した場合にのみ、Pythonスクリプト(したがって、完全に&&の動作をエミュレート)を実行したい場合は、このような

1

私はおそらくのpushd/POPDを使用したい:

pushd some\other\dir 
$q=python JsonMaker.py | ConvertFrom-Json 
popd 
1

スクリプトは私には正常に見えます。 ConvertFrom-Jsonが(私はそう思わない)終了例外をスローしない限り、スクリプトは続行され、cd $cwd行があなたを戻ってくるでしょう。

あなたはcoulodでもPush-/Pop-Locationを使用していますが、それは基本的にはあなたがすでに持っているものを「きれいに」する方法です。 Ex。

​​
+0

デフォルトでは、 'Start-Process'はパイプラインに何も書き込まれません。 '-PassThru'では' Process'オブジェクトを書きますが、出力ストリームをパイプラインに書き込むオプションはありません。 – PetSerAl

+0

これは実際に正しいと思われます。テストする時間がありませんでした。削除されました。ありがとう。 :-)私は '-wait'を追加しませんでした。 –