為方便起見,我已將所有檔案重命名為示例中的簡單名稱。
我正在嘗試使用批處理檔案(test.bat) 中的 C 入口點運行可執行檔案(test.exe),并從文本檔案(test.txt) 中傳遞引數。最終目標是使用測驗軟體 (test.exe) 在 SDK 上運行單元測驗。int main(int argc, char* argv[])
我的問題是我不想在呼叫可執行檔案時使用變數,因為它使代碼更難閱讀:
rem This works
set /p test_input=<test.txt& call test.exe %test_input%
經過一番研究,我想我應該像這樣使用輸入重定向:
rem This does not work
call test.exe < test.txt
這不起作用,我不明白為什么。
這是我最初嘗試過的,之前在 SO(這里)上已經提出過建議。我可以訪問 test.exe 代碼,所以我可以列印 argc 和 argv :
int main(int argc, char* argv[])
{
if(new_argc >= 2)
{
if(strcmp("-help", argv[1]) ==0)
{
show_help();
return 0;
}
for(int i=1; i < argc; i )
{
if(strcmp("-framerate", argv[i]) ==0)
{
i ;
if(i < argc)
{
FrameRate = (float)atof(argv[i]);
}
else
{
std::cerr << "Parameters error" << std::endl;
return 0;
}
} else if ...
{
...
}
}
}
}
如果我手動輸入引數和引數,它會按預期作業。
測驗.txt
-arg1 param1 -arg2 param2 ...
測驗.bat
call test.exe < test.txt
輸出:test.exe 就像沒有引數或引數一樣運行。
編輯: 添加了一些關于入口點的細節并重命名了批處理變數。
uj5u.com熱心網友回復:
感謝我的問題下的評論,我被推向了正確的方向。
問題是我對<. 它的字面意思是“將檔案讀取到 STDIN”(如此處所述)。許多其他檔案站點給出了模糊的定義,例如(如在此處提到的)
command < filename : 輸入一個文本檔案并將文本傳遞給命令
我需要正確決議輸入,因為在orstdin中不可用,但通過.argcargvstd::cin
我的批處理代碼和文本檔案保持不變,并且我想保持相同的決議形式以避免重寫多個專案,因此我使用此處split的解決方案 1.3 輸入字串(稍作修改)并創建了一個.new_argv
std::vector<char*> split(const std::string& s, char delimiter)
{
std::vector<char*> tokens;
std::string token;
std::istringstream tokenStream(s);
while (std::getline(tokenStream, token, delimiter))
{
tokens.push_back(_strdup(token.c_str()));
}
return tokens;
}
int main(int argc, char* argv[])
{
std::string extra_input; // Variable to store the contents of test.txt
std::getline(std::cin, extra_input); // Recuperate the contents of test.txt
std::vector<char*> new_argv = split(extra_input, ' '); // Split the args
for(int i = argc - 1; i >= 0; i--)
new_argv.insert(new_argv.begin(), argv[i]); // Add the original args to the beginning
const size_t new_argc = new_argv.size(); // Create the new argc based on the final argument list (vector)
if(new_argc >= 2)
{
if(strcmp("-help", new_argv[1]) ==0)
{
show_help();
return 0;
}
for(int i=1; i < new_argc; i )
{
if(strcmp("-framerate", new_argv[i]) ==0)
{
i ;
if(i < new_argc)
{
FrameRate = (float)atof(new_argv[i]);
}
else
{
std::cerr << "Parameters error" << std::endl;
return 0;
}
} else if ...
{
...
}
}
}
// Important, don't forget to free the memory used by the _strdup
for(int i=1; i < new_argc; i )
{
if(i >= argc)
free(new_argv[i]);
}
}
測驗.bat
call test.exe < test.txt
測驗.txt
-arg1 param1 -arg2 param2 ...
當然,我需要添加一些檢查以使其正確處理空格,但這就是要點。感謝您的幫助和外部觀點。
編輯:修正了代碼中的一個錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428980.html
上一篇:批處理!ERRORLEVEL!并行運行多個命令時不起作用
下一篇:批處理退出時的隱式“popd”
