4

Я прошу прощения, если название вопроса немного сбивает с толку, но я хотел сделать его коротким.

По сути, я хочу взять системный формат даты (% DATE%) и заменить символы, которые будут неверными в команде или недопустимыми в именах файлов; например, пробелы и косые черты.

Однако среда, в которой я это делаю, ограничена. Это выполняется через службу, которая выполняет одну строку команд на компьютере клиента. Это означает, что я не могу использовать переменные (насколько мне известно), чтобы сделать это в несколько этапов, поскольку все, что я пробовал, не может видеть переменную, созданную в одной строке (при использовании & и && для объединения команд). О пакетных файлах также практически не может быть и речи, поскольку некоторым нашим клиентам было бы сложно заставить пакетные файлы разместить их в своей системе.

Прямо сейчас у меня есть команда, настроенная следующим образом:

MOVE C:\folder\file.csv C:\archive\^"file%DATE:/=-%.csv^"

Мне было интересно, есть ли какой-нибудь способ иметь несколько замен символов в% DATE:/= -%.

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

1 ответ1

1

Во-первых, в «чистом» cmd даты по своей сути сложны, поскольку вывод зависит от формата коротких дат. Это означает, что вы можете получить его в виде dd/mm/yyyy ; yyyy-dd-mm ; mm dd yy и т. д. Обычно я бы посоветовал использовать powershell или wmic, но они, вероятно, не обсуждаются в вашем случае, поэтому вам могут помочь два возможных трюка:
а) чтобы установить и прочитать переменную в той же строке, используйте call * - обратите внимание, что a должно быть сброшено перед выполнением для правильной работы:
set "a=10" & call echo %a%
б) Чтобы удалить один из нескольких возможных разделителей (но только один, и вы должны знать, сколько их будет), вы можете использовать for /f:
for /f "tokens=1-3 delims=-/" %F in ("%DATE%") do echo %F%G%H

*(примечание: если у вас есть контроль над тем, как запускается cmd, использование cmd /v:on включает так называемое отложенное расширение, так что вы можете использовать set "a=10" & echo !a!)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .