Одна из идей из комментария полностью ответила на мой вопрос (к точным потребностям, которые у меня были). Не уверен, как отдать ему должное здесь.
Решение состоит в том, чтобы просто закрыть стандартный ввод прямо перед использованием execvp (). Если команда не была выполнена при первом сканировании, программа выдает ошибку, которая является идеальной. Поскольку я запускаю основную программу, которую я использую в цикле, я могу использовать dup и dup2 для сохранения и перезагрузки стандартного ввода позже.
Код, который я использовал для проверки работоспособности:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
char command[1000];
int stdinput = dup(STDIN_FILENO);
close(STDIN_FILENO);
dup2(stdinput, STDIN_FILENO);
printf("Enter command: ");
scanf("%[^\n]s", command);
printf("%s\n", command);
}
Адаптированный к Powershell из одного из решений, предложенных в Статье 320369 Справки и Поддержки MS.
$ci = new-object system.globalization.cultureinfo "en-US"
$e = New-Object -COM "Excel.Application"
$e.Visible = $True
$e.UserControl= $True
$books = $e.Workbooks
$books.PSBase.GetType().InvokeMember( `
"Add", `
[system.reflection.bindingflags]::InvokeMethod, `
$null, $books, $null, $ci)
От той же статьи:
При использовании одного из этих обходных решений для компьютера, где региональные настройки не соответствуют текущей языковой версии Office, необходимо быть знакомы с тем, как Excel ведет себя и как Excel интерпретирует данные, которые могли бы быть отформатированы для определенной локали.
Office interop блоки, кажется, имеет эту проблему, когда текущей культурой не являются en-США. Очевидное обходное решение должно установить культуру.
Важно выполнить все это как единственную команду на интерактивной консоли, так как PowerShell V1 всегда создает новый поток для каждого вызова команды.
PS C:\Users\jachymko> $e = new-object -com excel.application
PS C:\Users\jachymko> $e.workbooks.add()
Exception calling "Add" with "0" argument(s): "Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
At line:1 char:17
+ $e.workbooks.add <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
PS C:\Users\jachymko> & {
>> [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
>> $e = new-object -com excel.application
>> $e.workbooks.add()
>> $e.visible=1
>> }
>>