Windows cmd echo / pipe добавляет дополнительное пространство в конце - как его обрезать?
Я работаю над скриптом, который выполняет приложение командной строки, которое требует ввода пользователя во время выполнения (к сожалению, аргументы командной строки не предоставляются).
Итак, моя первая попытка выглядела так:
@echo off
(echo N
echo %~dp0%SomeOtherDirectory
echo Y)|call "%~dp0%SomeDirectorySadSoftware.exe"
на первый взгляд казалось, что это работает довольно хорошо, но, как оказалось, это не так. После расследования я обнаружил, что каталог, который я передавал программному обеспечению, содержал дополнительное пространство в конце, что привело к некоторым проблемам.
I огляделся и обнаружил следующий вопрос:: echo добавляет пространство при использовании с трубой .
это объяснило, что происходит, но на самом деле не помогло мне решить мою проблему (я не слишком хорошо знаком с пакетным программированием).
на данный момент я "вроде как решил" свою проблему с уродливым обходным путем:
echo N> omg.txt
echo %~dp0%SomeOtherDirectory>> omg.txt
echo Y>> omg.txt
"%~dp0%SomeDirectorySadSoftware.exe"<omg.txt
del omg.txt
это решение работает, но я менее чем доволен им. Есть красивее способ? Или еще уродливее, но без временного файл?
1 ответов
Решение 1: Linefeeds
вы можете использовать linefeed, чтобы избежать пробелов.
The rem.
необходимо, что во избежание проблемы с впрыснутым &
на cmd.exe
SET LF=^
REM ** The two empts lines are required for the new line **
(
echo line1%%LF%%rem.
echo line2%%LF%%rem.
echo line3%%LF%%rem.
) | sort
когда блок передается cmd.exe перестроит блок, построив одну строку в сочетании с амперсандами между каждой командой.
(
echo line1
echo line2
) | sort
будет преобразовано в
C:\Windows\system32\cmd.exe /S /D /c" (<space>echo line1<space>&<space>echo line2<space>)"
таким образом, трюк linefeed приводит к строке как
C:\Windows\system32\cmd.exe /S /D /c" ( echo line1%LF%rem. & echo line2%LF%rem. )"
и это расширяется до
( echo line1
rem. & echo line2
rem. )
решение 2: сбежавшие амперсанды
Вы также можете использовать непосредственно амперсанды, но они должны быть экранированы, иначе пробелы все равно вводятся.
Последний rem.
, чтобы избежать пространства после последнего Эха
(
echo Line1^&echo Line2^&echo Line3^&rem.
) | more
решение 3: Создайте одну команду
@MCND упомянул трюк, чтобы использовать непосредственно форму:
cmd /q /c"(echo line1&echo line2&echo line3)" | sort
это работает, поскольку парсер видит только cmd
command, остальное обрабатывается как параметры для этой единственной команды.
Поэтому проблем с пространствами нет.
Или с linefeeds это выглядит как
cmd /q /c"(echo line1%%LF%%echo line2%%LF%%echo line3)"| (sort > out.txt)
и затем вы можете изменить его и
cmd /q /c^"(echo line1%%LF%%^
echo line2%%LF%%^
echo line3)^"| (sort > out.txt)