Как я могу написать знак перенаправления вывода (& gt;) в файл с помощью командной строки? [Дубликат]

Я хотел бы опубликовать ответ, который также использует curl для получения содержимого, и mpdf , чтобы сохранить результаты в pdf, поэтому вы получите все шаги типичного варианта использования.

// import mpdf somewhere
require_once dirname(__FILE__) . '/mpdf/vendor/autoload.php';

// get mpdf instance
$mpdf = new \Mpdf\Mpdf();

// src php file
$mysrcfile = 'http://www.somesite.com/somedir/mysrcfile.php';
// where we want to save the pdf
$mydestination = 'http://www.somesite.com/somedir/mypdffile.pdf';

// encode $_POST data to json
$json = json_encode($_POST);

// init curl > pass the url of the php file we want to pass 
// data to and then print out to pdf
$ch = curl_init($mysrcfile);

// tell not to echo the results
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1 );

// set the proper headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json) ]);

// pass the json data to $mysrcfile
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

// exec curl and save results
$html = curl_exec($ch);

curl_close($ch);

// parse html and then save to a pdf file
$mpdf->WriteHTML($html);
$this->mpdf->Output($mydestination, \Mpdf\Output\Destination::FILE);

В $ mysrcfile я буду читать данные json, подобные этому (как указано в предыдущих ответах):

$data = json_decode(file_get_contents('php://input'));
// (then process it and build the page source)

80
задан Jason 30 October 2008 в 21:03
поделиться

6 ответов

Символ escape-функции Windows по какой-либо причине. ^ / g0]

echo some string ^< with angle ^> brackets >>myfile.txt
145
ответ дан Tim Robinson 21 August 2018 в 13:20
поделиться
  • 1
    Ну, обратная косая черта используется для имен путей, а двойная кавычка - для обертывания имени файла, у которого есть пробелы, поэтому осталось немного вариантов символов. – James Curran 30 October 2008 в 21:27
  • 2
    Это также работает для других персонажей, таких как амперсанд (& amp;), спасибо. – tenfour 23 February 2011 в 18:20
  • 3
    Прекрасно работает! echo some string ^< with angle ^> brackets >>con приводит к: некоторой строке & lt; с углом & gt; скобки – Ross Bradbury 16 June 2011 в 15:33
  • 4
    Все потому, что оригинальные pc-dos использовали обратную косую черту для путей и обратной совместимости. – Jahmic 30 May 2014 в 07:13
  • 5
    Я подозреваю, что это было не все так случайно. Я предполагаю, что они хотели использовать персонажа, который вряд ли появлялся в обычном тексте, так что он не вызывал легко избегаемых, но нежелательных персонажей. – David A. Gray 14 November 2017 в 10:05

Вы также можете использовать двойные кавычки для выхода из специальных символов ...

echo some string "<" with angle ">" brackets >>myfile.txt
-2
ответ дан aalaap 21 August 2018 в 13:20
поделиться
  • 1
    Это не работает. echo some string "<" with angle ">" brackets >>con приводит к: некоторой строке & quot; & lt; & quot; с углом «& gt;» & quot; скобки , но OP хочет некоторую строку & lt; с углом & gt; скобки – Ross Bradbury 16 June 2011 в 15:31

Существуют методы, которые избегают escape-последовательностей ^.

Вы можете использовать переменные с задержкой расширения. Ниже представлен небольшой демонстрационный скрипт

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

. Или вы можете использовать цикл FOR / F. Из командной строки:

for /f "delims=" %A in ("<html>") do @echo %~A

Или из пакетного сценария:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

Причина, по которой эти методы работают, состоит в том, что как замедленное расширение, так и расширение переменной FOR происходят после того, как специальные операторы, такие как <, >, &, |, &&, || разобраны. См. . Как интерпретатор сценариев Windows (CMD.EXE) анализирует сценарии? для получения дополнительной информации.


sin3.14 указывает, что для труб может потребоваться несколько экранов . Например:

echo ^^^<html^^^>|findstr .

Труды причин требуют нескольких экранов, потому что каждая сторона канала выполняется в новом CMD-процессе, поэтому строка обрабатывается несколько раз. См. . Почему задержка с расширением заканчивается, когда внутри блок кода кода? для объяснения многих неудобных последствий реализации канала Window.

Существует еще один способ избежать множественных экранов при использовании трубы. Вы можете явно создать свой собственный CMD-процесс и защитить одиночный побег с помощью кавычек:

cmd /c "echo ^<html^>"|findstr .

Если вы хотите использовать технику с задержкой расширения, чтобы избежать побегов, то есть еще больше сюрпризов (вы не можете если вы являетесь экспертом по дизайну CMD.EXE, но нет официальной документации MicroSoft, которая объясняет этот материал)

Помните, что каждая сторона канала выполняется в своем собственном процессе CMD.EXE , но процесс не наследует отложенное состояние расширения - по умолчанию он отключен. Таким образом, вы должны явно создать экземпляр собственного процесса CMD.EXE и использовать параметр / V: ON, чтобы включить замедленное расширение.

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

Обратите внимание, что замедленное расширение выключено в родительском пакетном скрипте.

Но все ад разрывается, если в родительском скрипте включено замедленное расширение. Ниже показано not :

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

Проблема заключается в том, что !test! расширяется в родительском скрипте, поэтому новый процесс CMD пытается разобрать незащищенные < и >.

Вы можете избежать !, но это может стать сложным, потому что это зависит от того, цитируется ли ! или нет.

Если не указано , тогда требуется двойной escape:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

Если указано, то используется один побег:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

Но есть удивительный трюк, который позволяет избежать всех экранов - левая сторона трубы препятствует преждевременному расширению родительского скрипта !test!:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

Но я полагаю, что даже это не бесплатный обед, потому что парсерный парсер вводит дополнительное (возможно, нежелательное) пространство в конец, когда используются круглые скобки.

Aint batch scripting fun; -)

5
ответ дан Community 21 August 2018 в 13:20
поделиться

Правда, официальный escape-символ - ^, но будьте осторожны, потому что иногда вам нужны три символа ^. Это просто иногда :

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

. Один из трюков из этой бессмыслицы состоит в том, чтобы использовать команду, отличную от echo, для вывода и цитаты с двойными кавычками:

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

Обратите внимание, что это не будет сохранять начальные пробелы в тексте приглашения.

23
ответ дан Itsme2003 21 August 2018 в 13:20
поделиться

Экранирование скобок ala unix тоже не работает:

echo some string \ & lt; с углом \> скобки >> myfile.txt

Обратная косая черта будет считаться началом абсолютного пути.

0
ответ дан James Curran 21 August 2018 в 13:20
поделиться
  • 1
    Абсолютное имя пути относительно текущей буквы диска ...;) – dalle 31 October 2008 в 09:54
  • 2
    Обратная косая черта не считается началом абсолютного имени пути внутри текста для команды echo - это просто обычный текст, который получает канал, куда вы его отправляете. - echo \ работает, как и ожидалось. - Но да, "\ & quot; был бы неправильным выбором для символа escape-командной строки, поскольку каждая команда / программа, которая нуждалась в пути или имени файла, вы должны были бы ввести `\` вместо этого. – BrainSlugs83 16 September 2014 в 20:06
  • 3
    этот ответ не предлагает решение, по общему признанию, неопределенного вопроса – G-. 6 June 2016 в 13:35

Чтобы использовать специальные символы, такие как «>» в ​​Windows с эхом, перед этим вам нужно поместить специальный escape-символ.

Например,

echo A->B

не будет работать, так как '>' должен быть экранирован '^':

 echo A-^>B

См. также escape-последовательностей .

Имеется короткий командный файл, который печатает базовый набор специального символа и их escape-последовательности.

2
ответ дан orbitcowboy 21 August 2018 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: