我需要有关从批量脚本(.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%"
你能告诉我在哪里弄错了吗?
感谢和问候,
萨姆
答案 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%"