I'm a newb w/ Powershell and I am trying to perform similar operations I did previously in bash in PS. I'm working w/ a "driver" file of 25 Snowflake accounts. Each line in the driver file holds key info about a Snowflake account, delimited by ',', w/ field 5 (or 4 starting from 0) being the account's URL.
My goal is to parse the file, grab field 5 and modify it a bit, storing all lines in a variable. The variable would be used dynamically for various ad-hoc duties.
I'm trying:
$ALLACCTS=(foreach ($LINE in Get-Content -Path "snowflake_acct_driver.txt" | Select-String -Pattern '^#' -notmatch) {((($LINE -split ',')[4]) -Replace 'https://', '') -Replace '\.snowflakecomputing\.com', ''})
and getting errors like:
At line:1 char:24 $STUFF=(foreach ($LINE in Get-Content -Path "$HHOME\data\snowflake_ac ... ...
The foreach command works fine on its own, without being part of a variable assignment and no surrounding parenthesis. Any clues what I'm doing wrong?
CodePudding user response:
Since you're using a foreach statement as part of a larger expression, replace (...) with $(...)
That is, instead of:
$ALLACCTS = (foreach ...) -replace ...
use:
$ALLACCTS = $(foreach ...) -replace ...
Perhaps surprisingly, language statements such as foreach, while, switch, do, and if:
can be used as-is, in isolation as expressions in assignment statements (
$var = <statement>)can not be used as part of a larger expression via
(...), the grouping operator or at the start of a pipeline (<statement> | ...)- However, you can use them as such via
$(...), the subexpression operator, or@(...), the array-subexpression operator.
- However, you can use them as such via
See GitHub issue #6817 for a discussion.
