Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.
В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:
rb = GetComponent<Rigidbody>();
. Эта строка кода работает лучше всего под ваши функции Start()
или Awake()
. rb = AddComponent<RigidBody>();
Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))]
над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!
Я знаю, что это очень старая тема, но в предыдущих ответах нет полной реализации Tee в реальном времени, написанной в Batch. Мое решение ниже - гибридный сценарий Batch-JScript, который использует раздел JScript только для получения вывода из команды piped, но обработка данных выполняется в разделе Batch. Преимущество такого подхода состоит в том, что любой программный программист может модифицировать эту программу в соответствии с конкретными потребностями. Эта программа также корректно обрабатывает вывод команды CLS, созданной другими пакетными файлами, то есть очищает экран при обнаружении вывода команды CLS.
@if (@CodeSection == @Batch) @then
@echo off
setlocal EnableDelayedExpansion
rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala
rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed
if "%~1" equ "" (
echo Duplicate the Stdout output of a command in the screen and a disk file
echo/
echo anyCommand ^| APATee teeFile.txt [/A]
echo/
echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
goto :EOF
)
if "%2" equ ":TeeProcess" goto TeeProcess
rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"
rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1
rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF
:TeeProcess
rem Wait for "Data Available" signal
if not exist Flag.in goto TeeProcess
rem Read the line sent by JScript section
set line=
set /P line=
rem Set "Data Read" acknowledgement
ren Flag.in Flag.out
rem Check for the standard "End Of piped File" mark
if "!line!" equ ":_EOF_:" exit /B
rem Correctly manage CLS command
if "!line:~0,1!" equ "!cls!" (
cls
set "line=!line:~1!"
)
rem Duplicate the line in Stdout and the Tee output file
echo(!line!
echo(!line!>> %1
goto TeeProcess
@end
// JScript section
var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) {
// Read the next line from Stdin
var line = WScript.Stdin.ReadLine();
// Wait for "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
WScript.Sleep(10);
}
// Send the line to Batch section
WScript.Stdout.WriteLine(line);
// Set "Data Available" signal
fso.MoveFile("Flag.out", "Flag.in");
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
WScript.Sleep(10);
}
// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");
Альтернативой является tee stdout для stderr в вашей программе:
в java:
System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));
Затем в вашем файле dos batchfile: java program > log.txt
stdout войдет в файл журнала, и stderr (те же данные) отобразятся на консоли.
Имеется Win32-порт команды Unix tee
, который делает именно это. См. http://unxutils.sourceforge.net/ или http://getgnuwin32.sourceforge.net/
@ tori3852
Я обнаружил, что
dir > a.txt | type a.txt
не работает (первые несколько строк списка только в каталоге - подозревают какой-то процесс разветвления и вторую часть, команда «type» была завершена до того, как завершилась личная запись?), поэтому вместо этого я использовал:
dir > z.txt && type z.txt
, которые выполнили последовательные команды, до завершения второго запуска.
Мне удалось найти решение / обходной путь перенаправления вывода в файл, а затем в консоль:
dir > a.txt | type a.txt
где dir - это команда, выход которой необходимо перенаправить, a.txt a файл, где хранить данные.
Я использую пакетную подпрограмму с инструкцией «для», чтобы получить команду вывода по одной строке за раз, и оба записывают эту строку в файл и выводят ее на консоль.
@echo off
set logfile=test.log
call :ExecuteAndTee dir C:\Program Files
Exit /B 0
:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0
Это вариант на предыдущем ответе от MTS, однако он добавляет некоторые функции, которые могут быть полезны другим. Вот метод, который я использовал:
set _Temp_Msg_Cmd=
команда сбрасывает redirection с использованием символа моркови ^
, чтобы исходные команды не оценивались первоначально %~n0_temp.txt
, который использует синтаксис расширения параметра командной строки %~n0
, чтобы получить имя командного файла. %~n0_log.txt
Ниже приведена последовательность команд:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
в окне команд ^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Вот пример:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
Таким образом, команда может просто добавляться после более поздних команд в пакетном файле, который выглядит намного чище:
echo test message %_Temp_Msg_Cmd%
Это может быть добавлено и к концу других команд. Насколько я могу судить, это будет работать, когда сообщения имеют несколько строк. Например, следующая команда выводит две строки, если появляется сообщение об ошибке:
net use M: /D /Y %_Temp_Msg_Cmd%
Я устанавливаю perl на большинстве своих машин, поэтому ответ с помощью perl: tee.pl
my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)
{
print $_;
print $output $_;
}
close $output;
dir | perl tee.pl или каталог | perl tee.pl dir.bat
сырой и непроверенный.
Проверьте это: wintee
Нет необходимости в cygwin.
Я столкнулся и сообщал о некоторых проблемах.
Также вы можете проверить unxutils , потому что он содержит tee (и не нужен cygwin), но будьте осторожны, что выходные EOL являются UNIX-подобными здесь.
Последнее, но не менее важно, если у вас есть PowerShell, вы можете попробовать Tee-Object. Введите get-help tee-object
в консоли PowerShell для получения дополнительной информации.
Это работает в режиме реального времени, но также является довольно уродливым, а производительность медленная. Не хорошо протестированы:
@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
ECHO %%I
ECHO %%I >> out.txt
)
pause
Вот пример того, что я использовал на основе одного из других ответов
@echo off
REM SOME CODE
set __ERROR_LOG=c:\errors.txt
REM set __IPADDRESS=x.x.x.x
REM Test a variable
if not defined __IPADDRESS (
REM Call function with some data and terminate
call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
goto :EOF
)
REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF
REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
> CON ECHO.%%Z
>> "%__ERROR_LOG%" ECHO.%%Z
goto :EOF
)
Если у вас есть cygwin в вашем пути к среде Windows, вы можете использовать:
dir > a.txt | tail -f a.txt
Я также искал одно и то же решение, после небольшой попытки я смог успешно выполнить это в командной строке. Вот мое решение:
@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on
Он даже захватывает любую команду PAUSE.
Что-то вроде этого должно делать то, что вам нужно?
%DATE%_%TIME% > c:\a.txt & type c:\a.txt
ipconfig >> c:\a.txt & type c:\a.txt
ping localhost >> c:\a.txt & type c:\a.txt
pause
mtee - небольшая утилита, которая очень хорошо работает для этой цели. Это бесплатно, источник открыт, и он просто работает.
Вы можете найти его на http://www.commandline.co.uk .
Используется в пакетном файле для вывода вывода И одновременно создает файл журнала, синтаксис выглядит следующим образом:
someprocess | mtee /+ mylogfile.txt
Где / + означает добавление вывода.
Предполагается, что вы скопировали mtee в папку, которая находится в PATH, конечно.
отправить вывод на консоль, добавить в консольный журнал, удалить вывод из текущей команды
dir >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1
Это работает, хотя это немного уродливо:
dir >_ && type _ && type _ > a.txt
Он немного более гибкий, чем некоторые другие решения, в том, что он работает по-своему, поэтому вы можете использовать его для добавления также. Я использую это довольно немного в пакетных файлах для регистрации и отображения сообщений:
ECHO Print line to screen and log to file. >_ && type _ && type _ >> logfile.txt
Да, вы могли бы просто повторить инструкцию ECHO (один раз для экрана и второй раз перенаправляя файл журнала), но что выглядит так же плохо, и это проблема обслуживания. По крайней мере, вам не нужно вносить изменения в сообщения в двух местах.
Обратите внимание, что _ - это просто короткое имя файла, поэтому вам нужно будет удалить его в конце вашего командный файл (если вы используете командный файл).
Как отобразить и перенаправить вывод в файл. Предположим, что если я использую команду dos, dir> test.txt, эта команда перенаправляет вывод в файл test.txt без отображения результатов. как написать команду для вывода вывода и перенаправления вывода в файл с помощью DOS, т. е. командной строки Windows, а не в UNIX / LINUX.
blockquote>Вы можете найти эти команды в biterscripting ( http://www.biterscripting.com ).
var str output lf > $output echo $output # Will show output on screen. echo $output > "test.txt" # Will write output to file test.txt. system start "test.txt" # Will open file test.txt for viewing/editing.
dir 1>a.txt 2>&1 | type a.txt
Это поможет перенаправить как STDOUT, так и STDERR
Я согласен с Брайаном Расмуссеном, это самый простой способ сделать это. В разделе Batch Files на его страницах Scripting Pages Роб ван дер Вуде предоставляет большую информацию об использовании команд MS-DOS и CMD. Я подумал, что у него может быть собственное решение вашей проблемы, и после того, как он копался там, я обнаружил TEE.BAT , который, кажется, именно так, представляет собой пакетное языковое исполнение MSE-DOS. Это довольно сложный пакетный файл, и я бы склонен использовать порт unxutils.
К сожалению, такой вещи нет.
Консольные приложения Windows имеют только один дескриптор вывода. (Ну, есть два STDOUT
, STDERR
, но здесь это неважно). >
перенаправляет вывод, обычно записываемый в дескриптор консоли, в дескриптор файла.
Если вы хотите иметь какое-то мультиплексирование, вы должны использовать внешнее приложение, на которое вы можете перенаправить вывод. Это приложение затем может снова записать в файл и на консоль.
Простое консольное приложение C # выполнило бы трюк:
using System;
using System.Collections.Generic;
using System.IO;
namespace CopyToFiles
{
class Program
{
static void Main(string[] args)
{
var buffer = new char[100];
var outputs = new List<TextWriter>();
foreach (var file in args)
outputs.Add(new StreamWriter(file));
outputs.Add(Console.Out);
int bytesRead;
do
{
bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
} while (bytesRead == buffer.Length);
outputs.ForEach(o => o.Close());
}
}
}
Чтобы использовать это, вы просто передаете исходную команду в программу и указываете путь к любым файлам, для которых вы хотите дублировать вывод. Например:
dir | CopyToFiles files1.txt files2.txt
Отобразит результаты поиска, а также сохранит результаты как в файлах file1.txt, так и в файлах2.txt.
Обратите внимание, что не так много ( что-нибудь!) на пути обработки ошибок выше, и поддержка нескольких файлов может фактически не потребоваться.
Следующее помогает, если вы хотите что-то действительно увидеть на экране - даже если пакетный файл был перенаправлен в файл. Устройство CON может использоваться также при перенаправлении в файл
Пример:
ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected >CON
ECHO fourth line on normal stdout again. maybe redirected
Также см. Хорошее описание перенаправления: http://www.p-dd.com /chapter7-page14.html
Так же, как unix
dir | tee a.txt
работает в Windows XP, для этого требуется установленный mksnt
Он отображается на прозвище, а также добавляется к файлу
@echo on
set startDate=%date%
set startTime=%time%
set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100
fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat
Это создаст файл журнала с текущим временем и временем, и вы можете использовать линии консоли во время процесса
Я хотел бы немного рассказать о превосходном ответе от Saxon Druce .
Как уже говорилось, вы можете перенаправить вывод исполняемого файла в текущий каталог следующим образом:
powershell ".\something.exe | tee test.txt"
Однако это только журналы stdout
- test.txt
. Это также не log stderr
.
Очевидным решением было бы использовать что-то вроде этого:
powershell ".\something.exe 2>&1 | tee test.txt"
Однако это не будет работать для всех something.exe
s. Некоторые something.exe
s интерпретируют 2>&1
как аргумент и терпят неудачу. Правильное решение состоит в том, чтобы вместо этого располагать апострофы вокруг something.exe
и его переключателей и аргументов, например:
powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt