func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let set = NSCharacterSet(charactersIn: "0123456789")
let inverted = set.inverted;
let filtered = string.components(separatedBy: inverted).joined(separator: "")
return filtered == string;
Единственное рабочее решение, которое я вижу, - перенаправить stderr во временный файл
java blah.jar %1 %2 2>stderr
, а затем проверка, было ли что-то записано в файл, и запись в журнал в этом случае.
for %%i in (stderr) do if %%~zi GTR 0 (
echo Parameters: %1 %2 >>log.txt
type stderr >> log.txt
)
Если пакеты запускаются не последовательно, а одновременно, вам нужно найти что-то для уникальной временной переменной:
set file=%time::=%
set /a file=file
set file=%file%%random%
java blah.jar %1 %2 2>stderr_%file%
for %%i in (stderr) do if %%~zi GTR 0 (
echo Parameters: %1 %2 >>log.txt
type stderr >> log.txt
)
Это позволит избежать конфликтов между несколькими запущенными пакетами. Однако в настоящее время вы ничего не используете для блокировки записи в файл журнала, и что-то может показаться неуместным, когда в него записываются другие данные (с другими пакетами вы можете получить чередование в echo
и введите команды
или, если вы также перенаправляете вывод java в этот файл, тогда он может смешаться с обычным выводом программы java:
Parameters: foo bar Some regular output Parameters: foo2 bar2 More output NullPointerException at Blah: What we really wanted to have right after the parameters IOException at Blah: This exception belongs to the parameters foo2 bar2
Вы можете использовать другой файл в качестве семафора для записи в журнал, чтобы избежать смешивания пакетных выводов: создайте файл [ copy nul file
], если вы хотите записать в журнал, удалите его после этого и перед попыткой его создания проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите
журнал стандартного вывода в log.txt
, когда программа Java завершилась, но снова с использованием семафора.
copy nul file
], когда вы хотите записать в журнал, удалите его после этого и, прежде чем пытаться создать, проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите
журнал стандартного вывода в log.txt
, когда программа Java завершилась, но снова с использованием семафора. создайте файл [ copy nul file
], когда вы хотите записать в журнал, удалите его после этого и, прежде чем пытаться создать, проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите
журнал стандартного вывода в log.txt
, когда программа Java завершилась, но снова с использованием семафора. Я не совсем понимаю, что вы спрашиваете, но вот некоторая информация, которая может помочь ...
Вы можете перенаправить stderr отдельно от stdout в файле .cmd или .bat. Чтобы перенаправить stderr, используйте что-то вроде этого:
MyCommand.exe > command.stdout.txt 2> command.stderr.txt
Затем вы можете проверить содержимое command.stderr.txt и, если оно есть, объединить его с command.stdout.txt в свой файл журнала. Или вы можете в любом случае объединить его. Если хотите, вы также можете повторить команду, которую вы выполнили, в окончательный файл журнала.
Вы также можете проверить код выхода в пакетном файле, используя% ERRORLEVEL% env var. Ожидается, что в exe-файлах будет установлено значение ERRORLEVEL в случае ошибки. Я не знаю, делает ли это java.exe. Должен, если он хороший гражданин на винде. Это может быть альтернативный способ узнать, завершилось ли приложение Java с ошибкой. Но это не гарантия того, что stderr ничего не получил. Например, приложение Java может распечатать исключение и трассировку стека, а затем выйти с кодом 0, что означает успех. В этом случае в stderr будет мусор, но ERRORLEVEL будет равен нулю.
EDIT : s / ERROR_LEVEL / ERRORLEVEL
Как насчет чего-то вроде этого (непроверено):
@echo off
@echo Batch file called with parameters: >> log.txt
@echo - %1 >> log.txt
@echo - %2 >> log.txt
start java something.jar method %1 %2 2>> log.txt
Попробуйте использовать ERRORLEVEL
java something.jar method %1 %2 2>> log.txt
IF %ERRORLEVEL% NEQ 0 GOTO Error
Error:
@ECHO There was an error
@ECHO Arg 1: %1 >> log.txt
@ECHO Arg 2: %2 >> log.txt
Такой командный файл должен помочь.
start_prog.cmd
CALL :Start_Prog arg1 arg2
GOTO :EOF
:Start_Prog
something.py %1 %2 2>&1 1>nul | "C:\Python26\python.exe" format_output.py %1 %2 >>log.txt
GOTO :EOF
Здесь я передаю stderr через конвейер и передаю аргументы в качестве аргументов. Затем вывод добавляется в файл log.txt.
Выбрасывать stdout
1>nul
Перенаправить stderr на stdout
2>&1
Транслировать stderr в сценарий для форматирования вывода и передавать аргументы в качестве аргументов.
| "C:\Python26\python.exe" format_output.py %1 %2
Добавить вывод в "log.txt" .
>>log.txt
В моей системе мне нужно вызвать python.exe, иначе канал не будет работать.
Вот два файла, которые я использовал "кое-что .py " и " format_output.py ".
something.py
import sys
print >>sys.stdout, " ".join(sys.argv[1:])
print >>sys.stderr, "java.io.exception etc..."
format_output.py
import sys
print "Batch file called with parameters:"
for arg in sys.argv[1:]:
print '- "{0}"'.format(arg)
print "Exception:"
for line in sys.stdin:
print line
И, наконец, вот результат.
log.txt
Batch file called with parameters:
- "arg1"
- "arg2"
Exception:
java.io.exception etc...
не хватает только того, что что-то всегда записывается в файл "log.txt" .
Что-то вроде этого может сработать:
javastart.cmd
@echo off
set params=%*
for /f "delims=" %%e in ('java something.jar method %1 %2 ^>nul') do (
echo Batch file called with parameters:>>log.txt
echo - Args[]: %*>>log.txt
echo - Arg[1]: %1>>log.txt
echo - Arg[2]: %2>>log.txt
echo Exception: %%e
)
Я сам не программист на java, я не могу проверить этот вывод / Ситуация, но:
1: % * означает все параметры, от 1-го до последнего (даже% 12, хотя он не доступен напрямую ..) независимо от форматирования. Возможно, лучше использовать это, чем ограничивать их. Даже с плохим интервалом / цитированием у вас также будут полные параметры. Я добавил строку в журнал, чтобы показать всю строку, затем параметры. Вы можете увидеть, где была проблема, если дело в неверных аргументах.
2: отправка stdout в null (^> nul) сохранит только вывод stderr, установленный в %% e
3: Все, что находится в части do , будет происходить только в тестовом операторе for , на самом деле есть что-нибудь в качестве вывода, то есть if %% e установлен.
С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.
Надеюсь, это поможет.
установлен в %% e3: Все, что указано в части do , будет происходить только в том случае, если тестовый оператор for фактически имеет что-нибудь в качестве вывода, т.е. если установлено %% e .
С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.
Надеюсь, это поможет.
установлен в %% e3: Все, что указано в части do , будет происходить только в том случае, если тестовый оператор for фактически имеет что-нибудь в качестве вывода, т.е. если установлено %% e .
С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.
Надеюсь, это поможет.