Следующий тестовый пакетный файл должен добавить строку, содержащую текущую дату, за которой следует текущее время, а затем текстовую строку, в файл output.csv, но это не так. Дата, время и текстовая строка записываются в соответствующие временные файлы, но три объединенные строки не записываются с помощью echo в файл output.csv, который даже не создается, хотя и записывается temp-out.txt. В чем дело?
date /t > temp-date.txt
time /t > temp-time.txt
:: actual external program will be here
echo textstring > temp-out.txt
set /p var-date =< temp-date.txt
set /p var-time =< temp-time.txt
set /p var-out =< temp-out.txt
set /p full_line = %var-date% %var-time% %var-out%
echo %full_line% >> output.csv
Итак, set /p "var-date = " 0<"temp-date.txt"
, set /p "var-time = " 0<"temp-time.txt"
, set /p "var-out = " 0<"temp-out.txt"
. Также эта строка неправильная set /p full_line = %var-date% %var-time% %var-out%
. Должно быть set "full_line=%var-date% %var-time% %var-out%"
.
В качестве примечания: :: actual external program will be here
должно быть rem actual external program will be here
, echo textstring > temp-out.txt
должно быть (echo textstring) 1>"temp-out.txt"
, а echo %full_line% >> output.csv
должно быть (echo %full_line%) 1>>"output.csv"
.
Я могу вам сказать @ЯрославРахматуллин. Проблема классифицируется как опечатка, а это просто случай неиспользования документированного синтаксиса для команды set
: set [/p] <variable> = [<promptString>]
вместо set [/p] <variable>=[<promptString>]
и set [<variable> = [<string>]]
вместо set [<variable>=[<string>]]
. Всем отправителям следует сначала проверить справочную информацию для каждой из своих команд, прежде чем задавать вопрос. Таким образом, этот вопрос не представляет никакой ценности для сообщества, поскольку все будущие подобные проблемы также можно решить, прочитав ту же самую легкодоступную информацию.
@ЯрославРахматуллин Закрытие действительно. На SO есть множество сообщений, где добавление пробела до или после =
в batch-file
вызывает проблему и поэтому считается опечаткой. Причина также была разъяснена в комментарии @Squashman и не требует дополнительных ответов.
Мои ответы на вопрос Почему после использования «set var = text» в командной строке не выводится строка с «echo %var%»? и по вопросу Почему команда ECHO печатает в файл лишний конечный пробел? подробно объяснить, почему в командном файле следует использовать командные строки, предоставляемые Compo.
Пробел до и после знака равенства имеет значение в Windows cmd. Это то, что вы хотите:
date /t > temp-date.txt
time /t > temp-time.txt
:: actual external program will be here
echo textstring > temp-out.txt
set /p var-date=<temp-date.txt
set /p var-time=<temp-time.txt
set /p var-out=<temp-out.txt
set full_line=%var-date% %var-time% %var-out%
echo %full_line% >> output.csv
Флаг /p используется для запроса пользователя или предположительно для чтения со стандартного ввода. В первых трех случаях использование /p допустимо, поскольку чтение выполняется с помощью специального синтаксиса =<. Однако в последнем наборе его следует удалить, поскольку все значения находятся в других переменных и их не нужно считывать.
Вы также можете упростить:
echo %var-date% %var-time% %var-out% >> output.txt
Я бы порекомендовал вам взглянуть на мои комментарии под самим вопросом, чтобы увидеть, как можно улучшить некоторые из тех строк, которые вы использовали. Два из них, в частности, технически не достигают намеченной цели.
Я бы рекомендовал вам запустить скрипт как есть и проверить, что он делает. В вашем комментарии говорится, что нужно убрать пробелы вокруг знака =. В моем ответе нет пробелов.
Я рекомендую вам точно рассказать мне, каково содержание output.csv
, включая все пробелы!
Несколько лишних мест еще никому не вредили. Не принимайте близко к сердцу. Со временем ОП узнает все, что им нужно. Кроме того, другие комментарии уже закрыли лишние пробелы. Вам не нужно охватывать все крайние случаи и все лучшие практики в каждом ответе. Подумайте об этом.
Как ведущий веб-сайт по программированию, мы должны стараться использовать лучшие практики во всех наших ответах. Вы добавили ненужные и ненужные пробелы в поле CSV-файла, что потенциально опасно, особенно когда некоторые программы применяют стили форматирования к данным в своих средствах просмотра.
Вы создали переменную с именем
full_line[space]
. Не используйте пробелы в именах переменных.