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)