Куча говна / Говнокод #18015 Ссылка на оригинал

0

  1. 1
http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx

Что за хрень? С каких пор \ в виндовой консоли эксейпит кавычки? Эскейпящий символ же ^?

Запостил: 3_14dar 3_14dar, (Updated )

Комментарии (88) RSS

  • Сём, ты чё программированием-то вдруг заинтересовался? Вайп и срачи интереснее же.
    Ответить
  • ^ - в виндовой сосноли символ, указывающий компилятору на целостность строки.
    run ololololo^
    lolololo.exe
    Ответить
      • если ты напишешь ^ в конце строки, то интерпретатор проигнорирует знак переноса и воспримет

        ololololo
        lolololo.exe

        как ololololololololo.exe
        Ответить
        • Ну да, я об этом же - часть символов эскейпится крышкой, кавычки бекслешем, который по совместительству разделитель в пути, из-за чего у меня и вылезла проблема - параметр заканчивался на \". Нахуя весь этот цирк?
          Ответить
          • Выход один: просто не юзать batch. Переходи на vbs или AutoIt.
            Я намучался с консолью, когда учился писать примитивные трояны, и ещё в детстве зарёкся впредь иметь с ней дело.

            Глянь вот это: https://www.autoitscript.com/site/
            Синтаксис напоминает KIXTART, но возможности куда шире. Поддерживается компиляция скрипта в *.exe, можно интерфейс приделать - даже визуальный дизайнер форм есть, как в делфях. Вполне годный язык.
            Ответить
            • Там примитивный бат с подстановкой параметров в скрипт, и те же проблемы и без этого.
              Ответить
            • Это проблемы не консоли, а идиотского cmd.exe.

              Кстати, можно ещё писать на bash, на tcl (с библиотекой tk можно даже писать графические программы), на Перле, на Пухтоне, даже на JScript. Каких только извращений сейчас нет!
              Ответить
                • Я даже не знал, что такая функция есть... Всегда юзал PathGetArgs/PathRemoveArgs.
                  Ответить
                  • Ее юзает, например, путхон

                    >py -c "import sys;print sys.argv" "\"
                    ['-c', '"']
                    Ответить
                    • Тонко. Я тоже попробую ее поюзать.
                      Кстати, вышеупомянутые функции пишут в аргумент, что стало причиной многих багов у меня.
                      void PathRemoveArgs(
                        _Inout_  LPTSTR pszPath
                      );

                      Потом нашёл обёртку в JEDI, там на асме. Потом листнул справку, и понял, что нехорошо есть бананы вместе с кожурой:
                      function RemoveArgs(const path:string):string;
                      var
                         S:string;
                      begin
                         s:=path; // борландовские строки. Копия в памяти не создаётся, просто увеличивается счётчик ссылок.
                         UniqueString(s); // создаём копию строки.
                         PathRemoveArgs(pchar(s)); 
                         result:=s;
                      end;

                      Наверняка можно изящнее, но я устал.
                      Ответить
                        • SysUtils.pas
                          function GetFileVersion(const AFileName: string): Cardinal;
                          var
                           FileName: string;
                           InfoSize, Wnd: DWORD;
                           VerBuf: Pointer;
                           FI: PVSFixedFileInfo;
                           VerSize: DWORD;
                          begin
                           Result := Cardinal(-1);
                           // GetFileVersionInfo modifies the filename parameter data while parsing.
                           // Copy the string const into a local variable to create a writeable copy.
                           FileName := AFileName;
                           UniqueString(FileName);
                           InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
                           if InfoSize <> 0 then
                           begin
                             GetMem(VerBuf, InfoSize);
                             try
                               if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
                                 if VerQueryValue(VerBuf, "\", Pointer(FI), VerSize) then
                                   Result:= FI.dwFileVersionMS;
                             finally
                               FreeMem(VerBuf);
                             end;
                           end;
                          end;
                          Ответить
                            • Не совсем. Ты хочешь сказать, что оно похерит данные входного параметра, даже если его передать как неконстантную строку?
                              Ответить
                              • * неконстантную в смысле без указания const, но и без var, по идее при этом и создаётся локальная копия.
                                Ответить
                                • Строки в делфи особенные. Один раз выделяется память под строку, а операции присваивания лишь изменяют счетчик ссылок. Компилятор неявно вызвает UniqueString, когда ему кажется, что строка будет изменена (в справке вроде так написано). Особенность в том, что в данных примерах передаётся указатель на строку (PathRemoveArgs(pchar(s));), а процедура рассматривает его как InOut, т.е. повреждение данных вполне возможно.
                                  Ответить
                                      • То есть, существующую строку нельзя изменить, для этого надо создать новую (объект, на который ссылаются ссылки)
                                        Ответить
                                        • Там немного хитрее. Если счётчик равен одному - строку менять можно, т.к. её буфер больше никто не видит. Если счётчик больше 1 - менять нельзя, поэтому делается копия буфера, у которой счётчик будет равен 1, и её можно будет менять.

                                          В Qt QString точно так же работает.
                                          Ответить
                                          • P.S. При этом у старого буфера счётчик уменьшается на 1. И если там окажется единичка - его тоже смогут менять без копирования.
                                            Ответить
                                            • Ну почему неизменяемые то? Когда буфер не расшарен - ещё как изменяемые.

                                              Неизменяемые это в жабе. Создал и всё. Больше никто никогда не поправит.
                                              Ответить
    • А если у меня файл, имя которого заканчивается крышкой, что делать?
      Ответить
      • интерпретатор юзает SearchPath. Возможно, стоит дублировать символ?
        Ответить
        • А можно имя файла завернуть в кавычки...

          Единственного решения на все случаи жизни нет.
          Ответить
          • Недавно наткнулся на пост, там опытные юзера разбирали аналогичный вопрос, только там не одни кавычки, а кавычки и пробел, в имени файла. Задача достаточно нетривиальная, универсального решения быть не может, соглашусь.
            Ответить
          • >А можно имя файла завернуть в кавычки...
            Ты это к тому, почему кавычки эскейпятся не крышкой? Но в баше же с этим как-то живут.
            Ответить
            • >>Но в баше же с этим как-то живут.
              Возможно, Вы имели в виду: в башне?
              Ответить
          • Да, но зато все заметили, что у Микрософта слишком много эскейп-символов.
            Ответить
            • Каждый раз, когда мне приходилось более менее серьезно изучать бат - я проклинал его, но, сука, тут же даже не бат а тупо командная строка. Мне только из-за этого гуй юзать? Мб. хватит питона 2 с его глючными литералами строк?
              Ответить
            • Майкрософт - один сплошной эскейп-символ. Вчера винда обновилась, теперь дрожу от страха. Обама явно что-то замышляет, небось поручил напихать троянов в патчи.
              Ответить
  • Лень создавать отдельный тред...

    Шел 2015 год, а разрабы ланчера пятой ГТА так и не осилили юникодные пути. Они его на делфи 7 что ли писали?
    Ответить
    • >>делфи 7

      Вы так говорите, будто это что-то плохое.
      Ответить
    • Седьмой же юникодный, в отличие от того, каким был скомпилирован тотал коммандер.
      Ответить
      • С поддержкой юникода. Но по умолчанию емнип не юникод.
        Ответить
        • Хуй собачий он переписал. Где-то я натыкался на стандартный глюк байтовых полей (если выделить руссий текст, когда выставлен нерусский язык клавиатуры и скопировать - вставятся козюбрики)
          Ответить
            • Было с ним интервью, где он говорил, что не хочет перейти на свежий делфи чуть не из-за совместимости с win 3.х (было это где-то в 2006-2007), тогда я подумал, что он окончательно ебанулся.
              Ответить
    • >> Они его на делфи 7 что ли писали?
      так вот куда исчезал стретор....
      Ответить
    • Виндофоновский RD клиент тоже в своё время (щас не знаю) не умел подрубаться к компу, если у того в названии была кириллица.
      Они не одиноки
      Ответить
      • А firebird не цепляется к базе, если комп называется COM1...
        Ответить
        • Ну это вообще известная вендофигня, известная с 90-х. Был один игровой сервер, который создавал файлы с именами юзеров. Если зарегать юзера с именем LPT1, он тупо вис.
          Ответить
      • Ага. Social Club или как там его. Жаловались, емнип, именно купившие, а не пираты.
        Ответить
        • >Жаловались, емнип, именно купившие, а не пираты.
          Что-то удивительное?
          Ответить
          • Это часть фразы о том, что ланчер официальный.

            А удивляться тут нечему. После второго ведьмака, у которого конфигурялка писала конфиг в одну папку, а движок читал из другого, чему-то удивляться уже сложно...
            Ответить
            • Я понял. Что удивительного что жаловались купившие?
              Ответить
              • Помню покупали лицензию 1С 7. с аппаратным ключом, через какое то время ставили эмулятор ключа потому как от этого ключа глюков было не мерено.
                Ответить
                • У 1с ещё есть (или были?) ебанутые ключи с ограниченным количеством активаций. Переставил винду 3 раза - покупай новый ключик.
                  Ответить
              • Абсолютно ничего удивительно. Просто факт, которым я пытался подтвердить официальность ланчера.
                Ответить
                • Лаунчер, компилировался на пиратской винде.
                  ЗЫ типичная отмазка ТП, какого нить интепрайзного софта который не неприлично глючит.
                  Ответить
                  • Да почему на пиратской? Просто компилировали и тестировали америкосы, которым юникодные символы в именах нахуй не сдались.
                    Ответить
                    • И что сделали после багрепортов?

                      А вот со старкрафтом бы такого не было.
                      Ответить
                      • Да пофиксили вроде, там первый патч на несколько гигов был. Я не в курсе, нету особого желания в гта бегать. Тем более в такую сырую.
                        Ответить
                        • По-моему, уже даже пендосы должны были понять, что не поддерживать юникод в 2015 году просто некультурно. А что игры выпускают сырыми - уже привычно, вот когда устройства выпускают с сырой прошивкой. У меня щас всечатление, что устройстра надо покупать не раньше полугода-года, чтобы прошивка устаканилась.
                          Ответить
                          • > устройства выпускают с сырой прошивкой
                            Я лет 10 назад купил себе плеер с SD карточкой. Вот где была *пиздец* сырая прошивка. Никакие настройки не сохранялись - ни громкость, ни последний трек, ни радио. На битрейтах больше 128 - треск и щелчки. Потом вышла прошивка, которая всё это с горем пополам пофиксила. А через полгода плеер исчез с сайта производителя. Как-будто его и не выпускали. Предыдущие и следующие модели были, а эта пропала. Я тогда радовался, что успел вовремя накатить прошивку...
                            Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8