Как вы уже выяснили, проблема заключается в том, что пробелы в трубе замыкаются, и, как вы можете видеть в ответ Джеба для пробежки пробелов требуется специальная обработка.
Один аспектиз каналов, которые приводят к путанице, является то, что переданные по конвейеру команды не выполняются в контексте пакетного файла с правилами синтаксиса пакетной обработки, но они выполняются в контексте командной строки с правилами синтаксиса командной строки в дочернем экземпляре cmd.
Нужночтобы полностью понять механику труб CMD / Batch, чтобы иметь возможность конструировать и поддерживать рабочее решение таким образом, и это не простая задача для немного более сложных трубопроводных блоков.
Вот альтернативный способ, которыйпозволяет передавать любые сложные блоки команд с тем же уровнем гибкости, что и в обычных пакетных кодах.
@echo off
if "%~1"=="/LPipe" goto :/LPipe
if "%~1"=="/RPipe" goto :/RPipe
set /p user_id=Username:
set /p pwd=Password:
"%~f0" /LPipe | "%~f0" /RPipe
exit /b
:/LPipe
REM This will be executed inside a pipe but in batch context
REM Enable delayed expansion to be able to send any special characters
setlocal EnableDelayedExpansion
REM It's easy to take care of trailing spaces, no special hacks needed.
echo !user_id!
echo !pwd!
goto :EOF
:/RPipe
REM This will be executed inside a pipe but in batch context
%install_dir%\vpncli.exe connect myvpn.mydomain.TLD -s
goto :EOF