2015-05-26 54 views
0

我一直使用的是什麼我也讀到了嘗試使用了標準PS1:如何在Windows上自動運行非PATH plink(Putty Link)?並得到它的輸出?

ECHO y | plink ..... 

但我有問題是砰砰被保存在網絡驅動器上。我可以通過調用它:

$plink = "P:\path\plink.exe" 
echo y | &$plink -ssh -l user-pw password $addrss exit 
&$plink -ssh -l user -pw password -m "P:\path\SCOTDiagScript.txt" $addrss 

我的問題是,如果我通過CMD砰砰手動運行,我得到的輸出,我需要閱讀和可能顯示給用戶。將最後一行管道輸出到Out-File不會給我任何提示,如果我嘗試調用cmd然後重定向到txt文件,則會出現錯誤,因爲plink的路徑中有一個空格;我正在使用引號。

我也給了使用.NET一個嘗試,但做一個.StandardOutput.ReadToEnd()導致它掛起;死鎖也許?即使我把它做好出口前,我把它睡覺有點任何類型的退出發生前:

$ps = New-Object -TypeName System.Diagnostics.Process 
$ps.StartInfo.UseShellExecute = $false 
$ps.StartInfo.RedirectStandardInput = $true 
$ps.StartInfo.RedirectStandardOutput = $true; 
$ps.StartInfo.FileName = "P:\path\plink.exe" 
$ps.StartInfo.Arguments = "-ssh -l user -pw password $addrss" 

[void]$ps.Start() 

Start-Sleep -m 500 
$ps.StandardInput.Write("cd c:/scot/bin`r") 
Start-Sleep -m 500 
$ps.StandardInput.Write("GetDiagFiles.exe`r") 
Start-Sleep -m 500 
$ps.StandardInput.Write("cd c:/temp`r") 
Start-Sleep -m 500 
$ps.StandardInput.Write("ls *.zip`r") 
Start-Sleep -m 500 
$ps.StandardInput.Write("cd c:/scot/monitor`r") 
$Out = $ps.StandardOutput.ReadToEnd(); 
Start-Sleep -s 10 
$ps.StandardInput.Write("exit`r") 

$PlinkStreamWriter.Close(); 
if (!$ps.HasExited) { $ps.Kill() } 
$Out 

我敢肯定,我做錯了什麼,但我已經在沖刷了一切MSDN和什麼都沒有。

+1

您是否連接到運行Cygwin的Windows服務器?調用'.exe'文件,但使用* nix命令('ls')的組合不常見。如果在SSH終端(PuTTY)中手動輸入命令序列,該命令序列是否工作? –

回答

0

做你問什麼應該是那麼容易,因爲:

plink -ssh -l user -pw password -m script.txt > output.log 

script.txt包含你的命令:

cd c:/scot/bin 
GetDiagFiles.exe 
cd c:/temp 
ls *.zip 
cd c:/scot/monitor 
exit 

如果這不起作用(因爲你要求你已經嘗試過類似的東西),給我們更多關於這個問題的細節。

+0

這工作恰到好處。我仍然需要使用&來調用它,但它似乎輸出信息的權利。 – user3377627

0

您還沒有創建System.Diagnostics.ProcessStartInfo對象以供給System.Diagnostics.Process對象。

你需要把`n在指令不`r結束,或者您可以使用.WriteLine方法

當我測試使用以下一些CMD.EXE的代碼,讓你需要的改變完全刪除它們,它應該與plink.exe一起工作

$ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo 
$ProcessStartInfo.UseShellExecute = $false 
$ProcessStartInfo.RedirectStandardError = $true 
$ProcessStartInfo.RedirectStandardInput = $true 
$ProcessStartInfo.RedirectStandardOutput = $true 
$ProcessStartInfo.FileName = "P:\path\plink.exe" 
$ProcessStartInfo.Arguments = "-ssh -l user -pw password $addrss" 

$Process = New-Object System.Diagnostics.Process 
$Process.StartInfo = $ProcessStartInfo 
$Process.Start() | Out-Null 

$Process.StandardInput.WriteLine("cd c:/scot/bin") 
$Process.StandardInput.WriteLine("GetDiagFiles.exe") 
$Process.StandardInput.WriteLine("cd c:/temp") 
$Process.StandardInput.WriteLine("ls *.zip") 
$Process.StandardInput.WriteLine("cd c:/scot/monitor") 
$Process.StandardInput.WriteLine("exit") 

$Process.WaitForExit() 

$stdoutput = $Process.StandardOutput.ReadToEnd() 
$erroutput = $Process.StandardError.ReadToEnd() 

Write-Host "Standard Output: $stdoutput" 
Write-Host "Error Output : $erroutput" 
Write-Host "exit code: " + $Process.ExitCode 
+1

'WriteLine'方法已經將一個換行符附加到字符串。手動添加一個不應該是必需的。 –

相關問題