3

Windows 内の Qt アプリケーションによって呼び出されるバッチ scrip(.bat) からの bash スクリプトの実行に関して助けが必要です。

問題の概要: 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%"

どこが間違っているのか教えてください。

ありがとう、よろしく、
サム

4

3 に答える 3

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 でこれをテストするには、リリース フォルダーから application.exe を実行していることと、バッチ ファイルもそのフォルダーにあることを確認してください。

于 2013-05-04T09:13:19.093 に答える
0

1 回の実行で 2 回コールすることはできませんwaitForStarted()。false を返す場合waitForStarted()は、メソッドの実行から戻っています。したがってif( ! waitForStarted()、プロセスが実行された後。

于 2012-06-07T16:02:01.640 に答える
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%"
于 2012-06-07T16:17:57.793 に答える