Контакт с кавычками в сценариях пакетной обработки Windows

Ответ Дэвида, конечно, правильный, но не совсем объясняет, зачем вам это нужно.

В принципе, при модульном тестировании вы тестируете единицу функциональности в изоляции. Вы проверяете, выводит ли вход ожидаемый результат. Иногда вы также должны испытывать побочные эффекты. Вкратце, проверьте, позволяет это сделать.

Например, у вас есть бит бизнес-логики, который должен хранить вещи с помощью DAO. Вы можете сделать это с помощью теста интеграции, который создает экземпляр DAO, подключает его к бизнес-логике и затем запихивает в базу данных, чтобы узнать, сохранен ли ожидаемый материал. Это уже не единичный тест.

Или вы можете издеваться над DAO и убедиться, что он вызван так, как вы ожидаете. С помощью mockito вы можете проверить, что что-то вызывается, как часто оно называется, и даже использовать сопоставления по параметрам, чтобы гарантировать, что он будет вызван определенным образом.

Откидная сторона модульного тестирования, как это, действительно что вы связываете тесты с реализацией, что делает рефакторинг немного сложнее. С другой стороны, хороший дизайн-запах - это количество кода, которое требуется для правильного его использования. Если ваши тесты должны быть очень длинными, возможно, что-то не так с дизайном. Поэтому код с большим количеством побочных эффектов / сложных взаимодействий, которые необходимо протестировать, вероятно, не очень хорошо.

56
задан David G 17 July 2009 в 21:00
поделиться

4 ответа

Это зависит от того, как Вы хотите использовать переменную. Если Вы просто хотите использовать значение переменной без кавычек, можно использовать или задержанное расширение и строковую замену, или эти for команда:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

Как andynormancx состояния, кавычки необходимы, так как строка содержит &. Или можно выйти из него с эти ^, но я думаю, что кавычки являются немного более чистыми.

при использовании задержанного расширения со строковой заменой Вы получаете значение переменной без кавычек:

@echo !myvar:"=!
>>> C:\my music & videos

можно также использовать эти for команда:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

Однако, если Вы хотите использовать переменную в команде, необходимо использовать заключенное в кавычки значение или включить значение переменной в кавычках:

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

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. Используя эти for команда для использования значения переменной без кавычек но необходимо будет окружить переменную кавычками при использовании его в командах:

    @echo OFF
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

, Короче говоря, нет действительно никакого очевидного способа для использования пути или имени файла, которое содержит встроенные пробелы и/или & с в пакетном файле.

35
ответ дан Patrick Cuff 26 November 2019 в 17:06
поделиться

Попытайтесь использовать символ ESC '^ ', например,

set myvar=c:\my music ^& videos

Вы сделаете, чтобы Вы были осторожны, при расширении myvar, потому что оболочка не могла бы рассматривать & как литерал. Если вышеупомянутое не работает, попытайтесь вставить каре в строку также:

set myvar=c:\my music ^^^& videos
1
ответ дан Dave 26 November 2019 в 17:06
поделиться

Используйте jscript.

Много лун назад (т.е. приблизительно 8 лет плюс-минус) я работал над большим C++/VB6 проект, и у меня были различные биты Сценария пакетной обработки, чтобы внести свой вклад сборки.

Затем кто-то указал на меня на Тест Joel , я был особенно очарован из точки 2 и приступил к обеспечению всех, что мои мало встраивают сценарии в один единственный сценарий сборки...

и это почти разбило мое сердце, получив все те небольшие сценарии сотрудничество, на различных машинах, с немного отличающимися установками, Вы Боги, это было ужасно - особенно установка переменных и передачи параметров. Это было действительно хрупким, малейшая вещь повредит его и потребует, чтобы 30 минут тонкой настройки начались снова.

В конечном счете - я могу быть упрямым меня - я отказался от всех, и приблизительно за день переписал все это в JavaScript, выполнив его от командной строки с CScript.

я не оглянулся назад. Хотя в эти дни это - MSBuild и Круиз-контроль, если я должен сделать что-то даже немного связанное со сценарием пакетной обработки, я использую jscript.

6
ответ дан Binary Worrier 26 November 2019 в 17:06
поделиться

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

, Например, если текст был просто "c:\my music" затем, Вы могли бы сделать:

set myvar = c:\my music

, Но потому что Ваш текст имеет & Вам нужны кавычки.

Редактирование:

Или поскольку Dave говорит в своем ответе, можно выйти из проблемных символов с [1 111] ^^^, но остерегаться того подхода как [1 112] & не единственный символ, из которого необходимо выйти. На практике намного легче придерживаться кавычек вместо того, чтобы выйти из всех проблемных символов.

1
ответ дан andynormancx 26 November 2019 в 17:06
поделиться
Другие вопросы по тегам:

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