powershellから複数のコマンド、例えばpsftpを呼び出す

psftp.exe(パテ)を使ってpowershellからファイルをSFTPしようとしています。私はopenなどの単一のコマンドを実行できますが、デフォルトのディレクトリを変更してからファイルを置く必要があります。次のコードはpsftpに私を連れて行きますが、cdから.. byeへの行は無視します。私はsftpコマンドを持っているバッチファイルを実行することができますが、可能であれば私はpowershellを使用して達成したいと思います。

$file = "C:\Source\asdf.csv"
$user = "user"
$pass = "pass"
$hst = "host"
$path="C:\ProgramFiles\psftp.exe"
$cmd = @"
-pw $pass [email protected]$hst
cd ..
cd upload
put $file
bye
"@

invoke-expression "$path $cmd"
6

1 答え

これを試してみてください:

$file = "C:\Source\asdf.csv"
$user = "user"
$pass = "pass"
$hst = "host"
$path="C:\ProgramFiles\psftp.exe"
$cmd = @(
"cd ..",
"cd upload",
"put $file",
"bye"
)

$cmd | & $path -pw $pass "[email protected]$hst"

コメントの質問に答えて:

最初の部分、 "$ cmd |" $ cmdの内容を後続のコマンドにパイプします。これは外部プログラム(cmdletまたは関数ではなく)であるため、$ cmdの内容を外部プログラムのstdinに送信します。

The "& $path" part says to treat the contents of $path as a command or program name and execute it.

残りの行はコマンドライン引数として外部プログラムに渡されます。

6
追加された
これは素晴らしいです。コマンドを配列に入れて、あなたはそこから私を失いました。なぜ我々は$ path -pw $ pass ..と最後に$ cmdを持っていますか?何が成し遂げられるのか?
追加された 著者 Afroz,
ちょっと@OldFartは、私が$ lastexitcodeが0であることをチェックすると、今すぐコマンドプロンプトからエラーメッセージをキャプチャする方法です
追加された 著者 Afroz,