2017-07-07 56 views
-1

我需要查询过的JetDirect协议的打印机(TCP-IP端口9100)Powershell的TCP-IP,如何,连接/送出数据/ ReadResult /断开

我已经编写代码来连接和断开,但认沽和读取数据我有一些问题:(

'printer.local:9100' | Connect-TcpHost | Disconnect-TcpHost 

结果

TcpDestNodes  IsOpen Latency Query 
------------  ------ ------- ----- 
printer.local:9100 True 0,7065 {} 

我的代码

function Connect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$Dest, 
    $TCPtimeout=250 
    ) { 
    Begin { 

    } Process { 
     ($HostName, $port) = $Dest.split(':') 
     Write-Verbose "$HostName : $port" 
     $tcpClient = New-Object System.Net.Sockets.TCPClient 
     $connect = $tcpClient.BeginConnect($HostName,$port,$null,$null) 

     Write-Verbose "Connecting..." 
     $timeMs = (Measure-Command { 
      $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) 
      Write-Verbose "Connecting 2..." 
     }).TotalMilliseconds 
     If (!$wait) { 
      Write-error "$HostName : $Port" 
      Write-Verbose "Close connections..." 
      $tcpClient.Close() 
      $tcpClient.Dispose() 
      return; 
     } 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $dest 
      tcpClient = $tcpClient 
      connect = $connect 
      IsOpen = $true 
      Latency = $timeMs 
      Query = @() 
     } 
    } End { 

    } 
} 
function Disconnect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp 
    ) { 
    Begin { 
    } Process { 
     Write-Verbose "Disconnecting..." 
     $ObjTcp.tcpClient.Close() 
     $ObjTcp.tcpClient.Dispose() 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $ObjTcp.TcpDestNodes 
      IsOpen = $ObjTcp.IsOpen 
      Latency = $ObjTcp.Latency 
      Query = $ObjTcp.Query 
     } 
    } End { 

    } 
} 
+1

您使用telnet连接到打印机,这已经是很多关于这个主题的博客。 [这一个](https://thesurlyadmin.com/2013/04/04/using-powershell-as-a-telnet-client/)涵盖了过程 –

回答

0

我写了2个新的功能将-TcpHost()和读TcpHost()

'printer.local:9100' | Connect-TcpHost -verbose | Put-TcpHost -query '@PJL INFO ID' -verbose | Read-TcpHost -verbose | Disconnect-TcpHost -verbose 

回报

TcpDestNodes : 10.48.5.102:9100 
IsOpen  : True 
Latency  : 0,8351 
Query  : {@{Type=Query; Data=System.Object[]}, @{Type=Answer; Data=System.Object[]}} 

enter image description here

我完整的TCP-Tools.ps1

function Connect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$Dest, 
    $TCPtimeout=250 
    ) { 
    Begin { 

    } Process { 
     ($HostName, $port) = $Dest.split(':') 
     Write-Verbose "$HostName : $port" 
     $tcpClient = New-Object System.Net.Sockets.TCPClient 
     $connect = $tcpClient.BeginConnect($HostName,$port,$null,$null) 

     Write-Verbose "Connecting..." 
     $timeMs = (Measure-Command { 
      $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) 
     }).TotalMilliseconds 
     If (!$wait) { 
      Write-error "$HostName : $Port" 
      Write-Verbose "Echec, Close socket..." 
      $tcpClient.Close() 
      $tcpClient.Dispose() 
      return; 
     } 
     Write-Verbose "Connection Available" 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $dest 
      tcpClient = $tcpClient 
      connect = $connect 
      IsOpen = $true 
      Latency = $timeMs 
      Query = @() 
     } 
    } End { 

    } 
} 
function Put-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp,[string]$query 
    ) { 
    Begin { 

    } Process { 
     if ($ObjTcp.tcpClient.Connected) { 
      Write-Verbose "Send > $query" 
      $ObjTcp.query += [pscustomobject][ordered]@{ 
        Type = 'Query' 
        Data = @($query) 
      } 
      $data = [System.Text.Encoding]::ASCII.GetBytes("$query`n") 
      $stream = $ObjTcp.TcpClient.GetStream() 
      $stream.Write($data, 0, $data.Length) 
     } else { 
      Write-error "N'est plus connecte !" 
      $ObjTcp.tcpClient.Close() 
      $ObjTcp.tcpClient.Dispose() 
      return; 
     } 
     $ObjTcp 
    } End { 

    } 
} 
function Read-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp, 
    $timeout=2500 
    ) { 
    Begin { 
     $step = 25 
    } Process { 
     $i=$timeout/$step 
     Write-Verbose "> Waiting Answer" 
     While ([int64]$ObjTcp.tcpClient.Available -le 0 -and $i--) { 
      Start-Sleep -Milliseconds $step 
     } 
     Write-Verbose "Reply $($timeout-$i*$step)ms > Bytes available: $($ObjTcp.tcpClient.Available)" 
     If ([int64]$ObjTcp.tcpClient.Available -gt 0) { 
      $stringBuilder = New-Object Text.StringBuilder 
      try { 
       $stream = $ObjTcp.TcpClient.GetStream() 
       $bindResponseBuffer = New-Object Byte[] -ArgumentList $ObjTcp.tcpClient.Available 
       [Int]$response = $stream.Read($bindResponseBuffer, 0, $bindResponseBuffer.count) 
       $Null = $stringBuilder.Append(($bindResponseBuffer | ForEach {[char][int]$_}) -join '') 

       Write-Verbose "Read > $(@($stringBuilder.Tostring() -split("`n"))[1])" 
       $ObjTcp.query += [pscustomobject][ordered]@{ 
        Type = 'Answer' 
        Data = @($stringBuilder.Tostring() -split("`n")) 
       } 
      } catch { 
       Write-error "Probleme !" 
       $ObjTcp.tcpClient.Close() 
       $ObjTcp.tcpClient.Dispose() 
       return; 
      } 
     } 
     $ObjTcp 
    } End { 

    } 
} 
function Disconnect-TcpHost (
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]$ObjTcp 
    ) { 
    Begin { 
    } Process { 
     Write-Verbose "Disconnecting..." 
     $ObjTcp.tcpClient.Close() 
     $ObjTcp.tcpClient.Dispose() 
     [pscustomobject][ordered]@{ 
      TcpDestNodes = $ObjTcp.TcpDestNodes 
      IsOpen = $ObjTcp.IsOpen 
      Latency = $ObjTcp.Latency 
      Query = $ObjTcp.Query 
     } 
    } End { 

    } 
} 
+0

14分钟之间询问和回答你自己的问题与两个非常彻底功能。在你写下你的问题之前,它看起来像你已经有了解决方案。 –

+2

@JamesC。自我回答是允许的,甚至鼓励,请参阅[我可以回答我自己的问题?](https://stackoverflow.com/help/self-answer) –

+0

我的代码放/读,不工作在我的第一篇文章,现在是不完美,我需要你的答案或你的改进想法 – Alban