1. Куча / Говнокод #14516

    +123

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    @echo off
    
    set PROGPATH="%ProgramFiles%\MyProg"
    
    rem И тут мы захотели проверить, существует ли наша папочка
    
    if not exists "%PROGPATH%" (
        mkdir "%PROGPATH%"
    )
    
    rem виндовый шелл как бы нам говорит "братюнь, погоди, не спеши"
    rem ""C:\Program was unexpected at this time.

    Патч:

    -set PROGPATH="%ProgramFiles%\MyProg"
    +set "PROGPATH=%ProgramFiles%\MyProg"


    http://stackoverflow.com/questions/535975/dealing-with-quotes-in-windows-batch-scripts

    Запостил: Elvenfighter, 06 Февраля 2014

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

    • Поциент в курсе, что команды "exists" не существует?
      Ответить
      • Ты то откуда знаешь, ты ж не любишь консоль?
        Ответить
      • Поциенту требуется курс моральной реабилитации после поиска этого бага.
        Ответить
        • Реабилитация после написания батников полагается в любом случае ;)

          Хотя бы молоко за вредность должны выдать.
          Ответить
          • Да там жесть. Если надо запустить какую-то внешнюю программу, а ты не знаешь, будет ли это нормальный .exe или другой .cmd, нужно обязательно писать "call something". Потому что если ты напишешь "something", и этот something окажется "something.cmd", твой скрипт закончится сразу же после вызова (ну как будто бы написали exec ./something.bat).
            Я в свое время очень много времени потерял, чтобы понять, что я напоролся на эту "фичу".
            Ответить
            • А если программа - он будет ждать?
              Ответить
            • А еще там есть замечательное заклинание setlocal enabledelayedexpansion разрешающее использование !переменных!, без которых с циклами нормально не поработать, т.к. все %переменные% подставляются в цикл один раз перед его стартом...
              Ответить
              • На самом деле, на cmd можно почти нормально писать - с циклами, функциями. Просто как этот пиздец выглядит...
                Ответить
                • Ну вот с тем заклинанием - можно. Я даже писал. Но это программирование на set'е и for'е очень бесит. Тот же bash хоть и упорот по-своему, но все же на порядок удобней.
                  Ответить
                  • я один раз пробывал на баше. Затем освоил питон в пределах чтоб скрипты писать, и более не знаю проблем питон на линуксе есть всегда. На винду тоже поднимается тоже легко.
                    Ответить
                    • Питон для подстановки параметров программы это все-таки оверкилл.
                      Ответить
                      • Зато нормальный язык с нормальными строками, нормальными циклами, нормальными списками, нормальной передачей аргументов в запускаемые процессы, нормальной работой с файлами. Не надо думать о кавычках, экранах, о том как аргументы разобьются, как включить delayedexpansion, как отрезать имя файла от полного пути и т.п. Куча либ в наличии, хочешь - отправляй мыло о завершении или ошибке, хочешь - по хттп что-то скачивай...

                        Короче питон по удобству и скорости написания скриптов порвет как тузик грелку все эти баши и тем более батники.

                        Один недостаток по сравнению с батниками - под виндой его надо ставить. Но с другой стороны ставить его один раз.
                        Ответить
    • Да, на грабли с кавычками я уже тоже наступал. В отличие от питуха, кавычки не исчезают после интерпретации шеллом, программы должны убирать их сами. Пруф:
      >find asd
      FIND: Неправильный формат параметра
      
      >find "asd"
      работает


      >+set "PROGPATH=%ProgramFiles%\MyProg"
      +set PROGPATH=%ProgramFiles%\MyProg
      Кавычки не нужны совсем.

      Алсо в батниках нужно использовать %~1 вместо %1, тогда батники не будут ломаться, если в параметре будут кавычки. За это ставьте мне большой плюсик, совет много нервов экономит.
      Ответить
      • А %~p1 как правильно использовать? Если не ошибаюсь, в WinXP в конце нет "\", а в Win7 есть, или наоборот.
        Ответить
        • Просто, скажем, вместо %1%2 используешь "%~1%~2" и оно будет работать вне зависимости от пробелов и кавычек в параметрах.
          Ответить
          • Не, я именно про %~p1. Скажем, есть у меня в %1 хрень вида c:\my\path\file.txt и я делаю copy %1 %~p1\backup.bak или %~p1backup.bak, и в каком-то случае это ломается в одной из ОС.
            Ответить
            • Да не ломается ничего, винда игнорирует несколько слешей подряд.
              Ответить

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