从.bat文件执行bash脚本,QT应用程序调用.bat文件

时间:2012-06-07 15:53:16

标签: qt bash batch-file

我需要有关从批量脚本(.bat)执行bash脚本的帮助,该脚本由Windows内的Qt应用程序调用。

问题概述:我需要通过Qt应用程序将文件从Windows传输到Linux机器,并在linux下运行bash脚本来执行一些命令。

到目前为止我做了什么:我可以通过Qt应用程序成功地将文件从Windows传输到Linux机箱。 Qt应用程序调用传输文件的批处理文件

示例

 void Qt_intro101::on_file_upgrade_clicked()
 {
     QFileInfo fileInfo( ui->selected_file->text() );
     if( !fileInfo.exists() )
     {
         QMessageBox::information(this, tr("Information"),
                           tr("Unable to find file for upgrading!"));
        return;
     }

     // copying update
     QString fileName = fileInfo.absoluteFilePath();

      //Check if cmd.exe is present in Clients system and is located at correct path
      QFileInfo cmdFile( "C:\\Windows\\system32\\cmd.exe");
      if( !cmdFile.exists() )
      {
          QMessageBox::information( this, tr( "Information" ),
                                  tr("Failed to find the cmd.exe ... Check cmd.exe is        installed and is in  C:\\Windows\\system32\\ !"));
           return;
      }

     QStringList arguments ;
     arguments << " /c" <<"c:\\temp\\upgradeTesting\\test.bat"<< fileName  ;
     QProcess *process = new QProcess( this );
     process->start( cmdFile.absoluteFilePath(), arguments ) ;
     if( !process->waitForStarted() )
     {
           QMessageBox::information(this, tr("Information"),
                             tr("Failed to start the process for upgrading!"));
           return;
      }


             QMessageBox::information(this, tr("Information"),
                             tr("Please wait while system is  upgrading   .. click Ok to exit this box"));
         qDebug() << fileName ;
         process->waitForFinished() ;
         qDebug() << process->readAllStandardOutput();
        QMessageBox::information( this, tr( "Information" ),
                             tr( "Upgradation is successful.. Please restart the system") ) ;
          process->deleteLater();

  }

我写了一个批处理脚本(.bat)来执行像

这样的命令
  pscp -pw "lol" "%TARGET_UPDATE%" squire@"%TARGET_IP%":"%BASE_DIR%"/ 

通过以下批处理文件执行bash脚本是批处理文件中的命令

  putty -pw "lol" -m test-update.sh squires@"%TARGET_IP%"
我甚至尝试了类似的东西

  C:\\Program Files\\putty.exe -pw "lol"  -m test-update.sh squires@"%TARGET_IP%"

你能告诉我在哪里弄错了吗?

感谢和问候,
萨姆

3 个答案:

答案 0 :(得分:2)

我认为使用QProcess :: execute(QString cmdstring)更容易 您也可以将参数传递给Batchfile本身

TEST.CPP

QFileInfo cmdFile( "C:\\Windows\\system32\\cmd.exe");
QProcess *process = new QProcess( this );
process->execute(cmdFile.absoluteFilePath() + " /c helloparam.bat \"my param\"  ");
process->waitForFinished() ;
qDebug() << process->readAllStandardOutput();

helloparam.bat

@echo off
echo hello %1

信息:要在IDE中对此进行测试,请确保您从release文件夹运行application.exe并将批处理文件也放在该文件夹中

答案 1 :(得分:0)

每次运行都不能拨打waitForStarted()两次。如果waitForStarted()返回false,则表示您正在从方法执行返回。因此,if( ! waitForStarted()您的流程正在运行。

答案 2 :(得分:0)

花了好几个小时后,我意识到我需要在批处理脚本中给出完整的路径名,以便Qt执行它。没有qt它工作正常,但如果我想通过QT应用程序运行批处理文件,那么我想我需要给出bash脚本的完全限定路径名。 例子

 putty.exe -pw "lol" -m C:\\temp\\upgradingTest\\test-update.sh squires@"%TARGET_IP%"

而不是

   putty -pw "lol" -m test-update.sh squires@"%TARGET_IP%"