Отображение вывода командной строки Windows и перенаправление его в файл

Это отличный вопрос, который дает возможность прояснить некоторые большие нюансы Javascript как языка.

Понимание указателей

В некоторых языках программирования существует понятие указателя. Указатель - это переменная, содержащая адрес другого указателя. Поэтому в языке, подобном c, const, доступный только для чтения и изменяемый, более очевиден:

#include 
int main(){
    const int counter = 0;
    *(int *)&counter = 39;
    printf("%d", counter);
}

В приведенном выше коде C мы создаем ссылку только на чтение на 0. Однако, используя указатели, мы приводим значение, указывающее на счетчик, а затем снова укажите на это значение. Счетчик не будет рассматривать это как изменение значения напрямую. Итак, мы видим, что на языке, использующем указатели, такой код можно сделать.

Однако возникает вопрос: а как насчет Javascript, где нет понятия указателя? Возможно, const в ситуации, отличной от Object, или Array следует считать неизменным.

Javascript как прототипический язык

Это затем переходит к следующему пункту. Javascript - это прототип языка. Это означает, что все в Javascript в конечном итоге представлено объектами, строящимися друг от друга. Учитывая все эти знания, все, что нам нужно сделать, - это сканировать документ или окно AKA с наивысшим доступным объектом

Использование наших знаний об указателях и прототипах

Поэтому было бы понятно, что даже значение «только для чтения», такое как const в Javascript, теоретически должно иметь вид мутации. Итак, вопрос в том, как можно пойти дальше и сделать это?

Пример кода - Mutating Const

const test = 'foo';
window['test'] = 'value mutated';
console.log(test);
// value emitted 'value mutated'

В приведенном выше примере кода значение, которое будет утешаться, будет value mutated. Это связано с тем, что в любой настройке браузера объект window + document будет кэшировать все переменные. Это позволяет изменять значения, поскольку компилятор не будет регистрироваться как изменяемое значение только для чтения. Мы создаем указатель (так сказать) на значение, используя окно, которое создает другую опорную точку. Так что да, const является изменяемым для значений, отличных от строк или чисел, даже если это значение только для чтения!

Пример кода - (попытка) для изменения Enum

Попытка изменить неизменяемое перечисление в Typescript

enum testTwo {
  test = 'value immutable'
}
const pointerToTestTwo = 'testTwo.test';

window[testTwo.test] = 'value mutated';
console.log(testTwo.test);
// value emitted 'value immutable'

не будет. Это потому, что перечисление в машинописи компилируется как IIFE (Немедленно Вызывается функция Expression), без каких-либо опорной точки. Единственный способ изменить enum - создать другую функцию, которая ссылается на enum.

Так что да, чтобы закончить эту точку. Const только для чтения действительно изменчив в Javascript во всех сценариях, в отличие от enum в Typescript, который является неизменным. Не стесняйтесь взглянуть на мою статью, в которой это обсуждается немного подробнее: Enums V. Constants

354
задан Edward Thomson 13 April 2012 в 02:40
поделиться

7 ответов

К сожалению, такого нет.

Консольные приложения Windows имеют только один дескриптор вывода. (Ну, есть два STDOUT , STDERR , но это не имеет значения) > перенаправляет вывод, обычно записываемый в дескриптор консоли, в дескриптор файла

Если вы хотите использовать мультиплексирование, вам нужно использовать внешнее приложение, на которое вы можете перенаправить вывод. Затем это приложение может снова записать в файл и в консоль.

21
ответ дан 23 November 2019 в 00:23
поделиться

Я согласен с Брайаном Расмуссеном, порт unxutils - самый простой способ сделать это. В разделе Пакетные файлы его Страницы сценариев Роб ван дер Вуд предоставляет обширную информацию об использовании команд MS-DOS и CMD. Я подумал, что у него может быть собственное решение вашей проблемы, и, покопавшись там, я нашел TEE.BAT , который, похоже, является реализацией пакетного языка MS-DOS для tee. Это довольно сложный пакетный файл, и я по-прежнему хотел бы использовать порт unxutils.

9
ответ дан 23 November 2019 в 00:23
поделиться

Простое консольное приложение 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());
        }
    }
}

Чтобы использовать это, вы просто передаете команду source в программу и указываете путь к любым файлам, которые вы хотите продублировать. Например:

dir | CopyToFiles files1.txt files2.txt 

отобразит результаты dir, а также сохранит результаты в файлах file1.txt и files2.txt.

Обратите внимание, что в способе обработки ошибок, описанном выше, не так много (ничего!), и поддержка нескольких файлов может на самом деле не требоваться.

23
ответ дан 23 November 2019 в 00:23
поделиться

Существует порт Win32 команды Unix tee , который делает именно это. См. http://unxutils.sourceforge.net/ или http://getgnuwin32.sourceforge.net/

92
ответ дан 23 November 2019 в 00:23
поделиться

Следующие действия помогут, если вы хотите, чтобы что-то действительно отображалось на экране, даже если командный файл был перенаправлен в файл. Устройство 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

0
ответ дан 23 November 2019 в 00:23
поделиться

Мне удалось найти решение / обходной путь перенаправления вывода в файл , а затем на консоль:

dir > a.txt | type a.txt

, где dir - это команда, вывод которой необходимо перенаправить, a.txt файл, в котором следует сохранить вывод.

129
ответ дан 23 November 2019 в 00:23
поделиться

.NET неправильно обрабатывает летнее время, несмотря на то, что дает нужные ответы. Вы хотите неверных ответов.

Краткая версия:

  • Как .NET может знать, что в 1977 году летнее время действовало весь год из-за энергетического кризиса?

  • Как .NET может знать, какими будут правила перехода на летнее время в Израиле, когда правила будут решаться кнессетом из года в год?

  • Как .NET знает, что США работали на летнее время круглый год во время Второй мировой войны, и с 1945 по 1966 годы правила DST варьировались в зависимости от региона, а правила по-прежнему варьировались в зависимости от региона.

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

Из записи блога Рэймонда Чена Почему переход на летнее время неинтуитивен :

Почему функции преобразования часовых поясов (win32) не используют часовой пояс, соответствующий времени года?

...

Win32 не пытается угадать, правила часового пояса действовали при этом в другой раз. Итак, Win32 говорит: " Четверг, 17 октября 2002 года 8:45:38 AM PST ".

Примечание: Тихоокеанское Стандартное время. Даже хотя 17 октября было во время Тихого океана Летнее время , Win32 отображает время как стандартное время, потому что это то, что время сейчас .

.NET говорит: " Ну, если правила в эффект теперь также был в силе на 17 октября 2003 года, тогда это будет дневное время ", поэтому оно отображается "Четверг, 17 октября 2003 года, 9 час. 45 мин. PDT "- летнее время.

Поэтому ответы, которые вы получите, неверны. Но так как вы ожидаете неправильного ответа, это то, что вы получаете.

-121--3383975-

Google Test рамка является альтернативой.

Вот простой пример из документации :

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

Он также хорошо играет с gmock , модельной структурой Google для C++.

-121--2297253-

Как отобразить и перенаправить выходные данные в файл. Предположим, если я использую dos команда, dir > test.txt, эта команда перенаправит выходные данные в файл test.txt без отображения результатов. как записать команду для отображения выходных данных; и перенаправить выходные данные в файл с помощью DOS, т.е. командная строка Windows, не в UNIX/LINUX.

Эти команды можно найти полезными в 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.
0
ответ дан 23 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

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