Почему “не устанавливает-P” работа после канала?

C:\>type c:\output.txt
abcd
C:\>type c:\output.txt | set /p V1=

C:\>set
... A bunch of junk, NOT seeing "V1"

Что случилось? Согласно всей документации для SET Я видел, %V1% должен был быть присвоен значение "abcd" от вышеупомянутого, нет?

Я нахожусь на Windows XP Pro, SP3, если он имеет значение.

9
задан DVK 10 August 2010 в 07:42
поделиться

1 ответ

Я не знаю, какой документ вы видели для команды set , но результат set /? четко указано:

Переключатель / P позволяет вам установить значение переменной для строки ввода, введенной пользователем .

(курсив мой). Я думаю, что set / p получает ввод с консоли независимо от того, что вы пытаетесь передать через стандартный ввод. Почему не ждет, я не уверен. echo xxx | set / p xx = также не может установить переменную.

Но если вы хотите установить переменную из однострочного файла, вы можете просто использовать один из них:

for /f "delims=" %%i in (c:\output.txt) do set V1=%%i
set /p V1=<c:\output.txt

Второй самый простой, но он не очень помогает, если вы хотите получить вывод произвольная команда, но вам может потребоваться сначала направить ее в файл.

Первый позволяет выполнять произвольные команды без временных файлов:

for /f "delims=" %%i in ('echo AAA') do set xx=%%i

На этой странице есть интересный фрагмент, в котором предполагается, что это связано с контекстами:

Хорошо, я сам выяснил, почему. Это потому, что | создает новый контекст, поэтому переменная никогда не попадает в остальную часть текущего контекста. Доказательство:
> set bar =
> echo aaa | (set / p bar = && set bar)
bar = aaa
> set bar
Бар переменных среды не определен

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

3
ответ дан 4 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

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