Как вызвать exe в скрипте powershell с выходом перенаправления в файл журнала [duplicate]

Вот мой сценарий, который в основном рассчитывает количество строк, затем добавляет, а затем подсчитывает их снова, чтобы у вас были доказательства, что это сработало.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
28
задан CLR 28 May 2009 в 05:22
поделиться

5 ответов

Вычисляет ли ожидаемый результат стандартную ошибку или стандартную версию?

работает ли это?

& $gpgLocation --import "key.txt" 2>&1 | out-file gpgout.txt
33
ответ дан Stobor 21 August 2018 в 18:14
поделиться
  • 1
    Похоже, 2 & gt; 1 работает !!!! Я искренне благодарю всех вас, ребята, которые нашли время, чтобы посмотреть на это! Я серьезно! – CLR 28 May 2009 в 15:26
  • 2
    Другим хорошим советом является то, что при использовании этого любой вывод из stderr будет завернут в объекты ErrorRecord. Таким образом, вы можете легко обрабатывать вывод ошибок, если хотите. – JasonMArcher 4 June 2009 в 04:19

Ответ Стобора велик. Я добавляю к его ответу, потому что мне нужно было выполнить дополнительные действия, если у exe была ошибка.

Вы также можете сохранить вывод exe в переменную, подобную этой. Затем вы можете выполнять обработку ошибок на основе результата exe.

$out = $gpgLocation --import "key.txt" 2>&1
if($out -is [System.Management.Automation.ErrorRecord]) {
    # email or some other action here
    Send-MailMessage -to me@example.com -subject "Error in gpg " -body "Error:`n$out" -from error@example.com -smtpserver smtp.example.com
}
$out | out-file gpgout.txt
6
ответ дан jhamm 21 August 2018 в 18:14
поделиться

Вы также можете использовать Out-Host, как показано ниже.

& $gpgLocation --import "key.txt" | Out-Host
6
ответ дан Jon 21 August 2018 в 18:14
поделиться

Кроме того, PowerShell просто не может захватить вывод некоторых программ, потому что они не записывают в stdout. Вы можете проверить это, запустив программу в PowerShell ISE (она находится в версии CTP 3 версии 2.0)

Если PowerShell ISE не может отобразить вывод в графической консоли, вы также не сможете его захватить и может потребоваться другой способ автоматизации программы.

3
ответ дан Josh 21 August 2018 в 18:14
поделиться
  • 1
    GPG, конечно, не будет напрямую манипулировать буфером экрана консоли. Или, по крайней мере, я бы нашел сильно маловероятным, что программа UNIX, которая просто нуждается в некотором выходе, будет беспокоить проклятия. – Joey 28 May 2009 в 07:49
  • 2
    Отображение ошибки в моей ситуации, к счастью, не было проблемой, просто захватив ее. Однако я думал об этой же проблеме, так как предположил, что не все приложения будут делать то же самое, когда дело доходит до выхода консоли. – CLR 28 May 2009 в 15:29

Для автоматизации GPG.EXE вам необходимо использовать переключатель --batch, как в:

& $gpgLocation --import "key.txt" --batch | out-file gpgout.txt

Без этого переключателя GPG может ожидать ввода пользователем.

3
ответ дан Ruben Bartelink 21 August 2018 в 18:14
поделиться
  • 1
    В моей ситуации это не так, но это хороший совет. У меня есть другое место, которое я могу использовать --batch. – CLR 28 May 2009 в 15:27
Другие вопросы по тегам:

Похожие вопросы: