code: func (c Client) RunWithInput(command string, stdout, stderr io.Writer, stdin io.Reader) (int, error) {
  	shell, err := c.CreateShell()
  	if err != nil {
  		return 1, err
  	}
  	defer shell.Close()
  	cmd, err := shell.Execute(command)
  	if err != nil {
  		return 1, err
  	}
  
  	var wg sync.WaitGroup
  	wg.Add(3)
  
  	go func() {
  		defer wg.Done()
  		io.Copy(cmd.Stdin, stdin)
  	}()
  	go func() {
  		defer wg.Done()
  		io.Copy(stdout, cmd.Stdout)
  	}()
  	go func() {
  		defer wg.Done()
  		io.Copy(stderr, cmd.Stderr)
  	}()
  
  	cmd.Wait()
  	wg.Wait()
  
  	return cmd.ExitCode(), cmd.err
  
  }
docs: // RunWithInput will run command on the the remote host, writing the process stdout and stderr to
  // the given writers, and injecting the process stdin with the stdin reader.
  // Warning stdin (not stdout/stderr) are bufferized, which means reading only one byte in stdin will
  // send a winrm http packet to the remote host. If stdin is a pipe, it might be better for
  // performance reasons to buffer it.