Сценарий powershell завершается в условии «если», если запускается из командной строки - PullRequest
0 голосов
/ 04 февраля 2009

Меня удивляет разница между двумя, казалось бы, одинаковыми сценариями.

first.ps1:

"A"
if ($true) { "B" } 
"C"

second.ps1:

"A"
if ($true) { "B" 
} 
"C"

Теперь откройте окно CMD и запустите эти сценарии следующим образом:

    powershell - < first.ps1
    powershell - < second.ps1

сначала производит:

A
B
C

пока второе производит просто

A

Ответы [ 4 ]

2 голосов
/ 04 февраля 2009

Это должно быть ошибка.

В случае перенаправления в cmd.exe функция завершается нормально и правильно, если блоки if и else по отдельности находятся в одной строке:

$candidate = '.\foo.txt'
$current= '.\bar.txt'

"Comparison starts"
if ($(diff $(get-content $current) $(get-content $candidate)).length -gt 0){"There was a difference"} 
else {"There was not a difference"}
"Comparison over"

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

Я бы сообщил об этом на сайте обратной связи PowerShell (connect.microsoft.com) .

2 голосов
/ 05 февраля 2009

Edit:

Да, Джей доказал это. Основная проблема заключается в том, что Powershell не поддерживает оператор «<». Я весь день искал официальную документацию в Интернете, но не нашел ее. Я только что пришёл ко мне, чтобы проверить некоторые старые заметки, и обнаружил, что ссылка не поддерживается в v1. Он поддерживает только «>».

Я попытаюсь обновить, если найду что-то более официальное, чем моя память. Оставив оригинальный текст только для полноты.


Я не думаю, что принятый ответ здесь совершенно правдив.

Взгляните на блог Ли Холмса: ссылка

Он является одним из разработчиков команды Powershell и написал Поваренную книгу Powershell, просто чтобы немного поверить своим словам.

Я столкнулся с такой проблемой с некоторыми сложными и архаичными сценариями Bat, которые основывались на причудливом причудливом двоичном перенаправлении. Powershell запускал файл Bat, но в тот момент, когда происходило двоичное перенаправление, он просто останавливался. Использование [Process]: запуск, как описано в сообщении в блоге, работал великолепно и позволил мне проанализировать вывод файла Bat, как и любой другой скрипт с хорошим поведением, для загрузки.

В вашем случае я предполагаю, что «diff» - это исполняемый файл, а не функция, а выводимый им двоичный код, а не текст.

Кстати, я действительно не вижу необходимости перенаправлять вывод скрипта в Powershell, как вы это делаете. Кажется, что-то контрпродуктивно. Вы написали сценарий powershell, похоже, что вы не используете параметр, специально предназначенный для обработки текущего ввода.

2 голосов
/ 04 февраля 2009

Не уверен, почему перенаправление на ввод не работает, но если вы просто указываете сценарий в качестве входного аргумента для powershell, похоже, он работает:

C:\fa2>powershell.exe C:\fa2\tc.ps1
Comparison starts
There was a difference
Comparison over
0 голосов
/ 10 февраля 2009

Я не думаю, что это ошибка. Попробуйте набрать каждую из этих строк на консоли, и вы увидите, что происходит. Когда вы печатаете и открываете скобку и не закрываете ее, PowerShell переходит в режим многострочного ввода. Для выхода из этого режима вам понадобится закрывающая скобка И пустая строка после. Если у вас есть пустая строка до или после буквы «С», она должна работать.

Конечно, возможно, это ошибка, и она имеет тот же эффект, что и многострочный ввод. :)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...