Как передать вывод команды2 как ввод команды1 в командной строке Windows
В моей программе я должен использовать diff
Команда от SUA, чтобы узнать разницу в 2 файла.
Я использую команду следующим образом:
diff xx yy
Вот
xx - /a/s/xx.txt
yy - /a/s/yy/txt
Путь xx.txt
а также yy.txt
в формате Windows. Но в SUA команда 'diff' принимает путь в формате UNIX как /dev/fs/C/a/s/xx.txt
а также /dev/fs/C/a/s/yy.txt
,
У нас есть команда winpath2unix
это преобразует путь в формат Unix. Поэтому я хочу использовать diff
команда в моей программе,
diff 'winpath2unix xx' 'winpath2unix yy'
Здесь я хочу бежать winpath2unix
команды и нужно передать вывод этих команд diff
команда.
В оболочке C это работает нормально. Но в командной строке его не работает.
Есть ли возможность запустить эту команду?
Или как я могу использовать csh
в CreateProcess?
2 ответа
Если в командной строке вы имеете в виду cmd.exe
есть трюк, который может помочь вам, который использует FOR
Команда для установки переменной в командном файле. Таким образом, вы создадите командный файл, который будет выглядеть примерно так
@ECHO OFF
FOR /F "tokens=1 delims=" %%A in ('winpath2unix %1') do SET xxWinPath=%%A
FOR /F "tokens=1 delims=" %%A in ('winpath2unix %2') do SET yyWinPath=%%A
diff xxWinPath yyWinPath
Если бы мы назвали этот пакетный файл doDiff.bat
, вы бы назвали это с синтаксисом doDiff.bat xx yy
,
Другое описание этой техники здесь. Раймонд Чен также демонстрирует подобную технику здесь. Официальная документация находится на MSDN под заголовком Итерация и разбор файлов.
Я думаю, что нашел ваш вопрос на другом форуме.:)
использование -c
чтобы отправить команду в качестве аргумента для tcsh, "" используется для кавычек в двойных кавычках, если путь winpath печатает путь, включающий пробел.
LPTSTR cmd[] = _tcsdup(TEXT("C:\\Windows\\posix.exe /u /c /bin/tcsh -c \"/bin/diff \"\"`winpath2unix /x/xx.txt`\"\" \"\"`winpath2unix /x/yy.txt`\"\"\""));
int RetVal = CreateProcess(NULL,
cmd,
NULL,
NULL,
TRUE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&sInfo,
&pInfo);
DWORD error = GetLastError();
Более подробная информация здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx