2010-03-01 2 views
4

Просто попытайтесь лучше понять, почему второй элемент ниже не работает. Первый элемент прост, второй кажется яснее, третий кажется неинтуитивным.«неожиданный токен» в PowerShell при полностью запуске исполняемого файла

# My path includes pscp so this works. 
pscp.exe -i $PRIVATE_KEY $file ${PROXY_USER}@${PROXY_HOST}:${PROXY_DIR} 

# This does not work. I get unexpected token error. Why? What does that mean? 
$PUTTY_PATH\pscp.exe -i $PRIVATE_KEY $file ${PROXY_USER}@${PROXY_HOST}:${PROXY_DIR} 

# & is required to solve the problem. 
& "$PUTTY_PATH\pscp.exe" -i $PRIVATE_KEY $file ${PROXY_USER}@${PROXY_HOST}:${PROXY_DIR} 
+0

Замечание: обычно рекомендуется обернуть все ваши аргументы в строках, чтобы помешать синтаксическому анализатору PowerShell. У меня возникли проблемы, прежде чем пытаться использовать $ FolderPath \ * и -p $ Password в качестве аргументов для исполняемого файла, где всегда будут работать «$ FolderPath \ *» и «-p $ Password». –

ответ

9

Это потому, что это также считается ошибкой синтаксического анализа:

"foo"\pscp.exe 

в то время как это разбирает правильно, как вы обнаружили:

"$PUTTY_PATH\pscp.exe" 

Это разрешает допустимую строку, но, как вы уже заметили, строка не выполняется. Вы должны использовать оператор вызова &, чтобы вызвать команду, названную следующей строкой.

0

Это взятие \ быть частью имени переменной, и жалуется, потому что это не законно. Если вы используете этот фрагмент, как я бы, поставив его в файл .ps1 на вашем пути, тогда я бы просто перешел к $ putty_path, если вы не хотите иметь pscp.exe в своем глобальном PATH env var.

+2

Нет, это не так. Кроме того, обратные косые черты в именах переменных * являются законными, для их просто требуется другой синтаксис для доступа (а именно '$ {var \ name}'). – Joey

+0

Я стою исправленный! – Segfault

0

Просто гадать, но у меня есть чувство, что вы можете злоупотреблять фигурными фигурными скобками. Вы пытаетесь вместо этого заменить переменную среды PROXY_USER? Обычно фигурные скобки используются для запуска нового блока операторов.

$Env:PROXY_USER 

Кроме того, вы можете инкапсулировать, что прокси-данные внутри строки, чтобы убедиться, что он рассматривается как один аргумент:

"$Env:[email protected]$Env:PROXY_HOST:$Env:PROXY_DIR" 
Смежные вопросы