При использовании windows контейнерных рабочих нагрузок на Azure Пакетные кавычки удаляются из аргументов командной строки, если они не содержат пробела.
Мы используем новейший C# SDK 13.0.0 и узел SKU виртуальных машин windows server 2019 с контейнерами.
Repro: создание задания и задачи, выполняющейся внутри контейнера docker (например, на основе образа docker mcr.microsoft.com/windows/servercore:ltsc2019 ) используйте командную строку cmd /S /C mkdir "c:/foo"
- убедитесь, что внутри контейнера docker команда выполняется как cmd /S /C mkdir c:/foo
- что не удастся.
Та же проблема описана в этих открытых контейнерах PR: https://github.com/opencontainers/runtime-spec/commit/deb4d954eafc4fc65f04c00a08e08c3e69df32d0
Изменить: я понял, что это было больше как утверждение, чем вопрос ... так что вот вопрос: каков обходной путь / исправление для этого поведения?
Изменить решение powershell -EncodedCommand : Я принял решение для переменной среды, но мы используем другое. Мы используем «https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe?view=powershell-5.1#-encodedcommand-base64encodedcommand
» - это скрывает кавычки и обратную косую черту из CommandLineToArgsvW и docker - это означает, что командная строка правильно собирается внутри контейнера docker на azure batch vm. (В C# это делается var base64EncodedCmd = System.Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes(cmd));
) Позаботьтесь также о правильном экранировании powershell. например, закодированная команда может быть чем-то вроде "& my.exe --% --input \\\"userprovidedparam\\""
(с использованием команд PowerShell "остановить синтаксический анализ" -%), в противном случае, например, значение $ (Get-Date) будет оценено