tags:

views:

232

answers:

3

Just trying to better understand why the second item below does not work. The first item is simple, the second seems clearer, the third seems unintuitive.

# 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}
A: 

It's taking the \ to be part of the variable name, and complains because it is not legal. If you are using this snippet like i would, by putting it into a .ps1 file in your path, then i would just cd over to $putty_path if you don't want to have pscp.exe in your global PATH env var.

Segfault
No, it's not that. Besides, Backslashes in variable names *are* legal, they just require another syntax to access (namely `${var\name}`).
Joey
I stand corrected!
Segfault
A: 

Just guessing, but I have a feeling you might be misusing the curly braces. Are you trying to get the environment variable PROXY_USER instead? Typically the curly brackets are used for starting a new statement block.

$Env:PROXY_USER

Also, you may want to encapsulate that proxy info inside a string to ensure it is treated as a single argument:

"$Env:PROXY_USER@$Env:PROXY_HOST:$Env:PROXY_DIR"
Goyuix
+4  A: 

That's because this is also considered a parse error:

"foo"\pscp.exe 

Whereas this parses correctly as you have found:

"$PUTTY_PATH\pscp.exe"

That resolves to a valid string but as you have already noticed, a string doesn't execute. You have to use the call operator & to invoke the command that is named by the string that follows.

Keith Hill