I'm trying to figure out how I can use undeclared variables in a string. This is a simplified example to demonstrate my issue
[string]$sentence="My dog is $age years old"
[int]$age = 6
$sentence | write-output
$age = 3
$sentence | write-output
Looking for this output:
My dog is 6 years old
My dog is 3 years old
Getting this output:
My dog is years old
My dog is years old
I've tried the following:
"My dog is `$age years old" #My dog is $age years old
$("My dog is `$age years old") #My dog is $age years old
$("My dog is $age years old") #My dog is 3 years old
Is it possible in any way to make this more compact? or is this the only way?
edit: I noticed the focus is on strings. I will share my code where this was an issue. I need to migrate a bunch of VBS-scripts (>40) varying from 20 lines to 2000 lines to Powershell
VBS-file:
Function InitializeApp
Dim sPath
...
End function
Powershell Script:
$vbs=Get-Content -path $path #get content in array, one line per index
$rules=
@(
[pscustomobject]@{
"name"="func_start";
"vbs" = 'Function (?<V1>\w*)'; # The regex named group V1 will initialized when match is found
"ps" = {"Function $1() `{`n"} # Group V1 is to be inserted in replacement string
}
)
function Invoke-TestAndReplace($line,$ruleName){
$r_vbs=$($rules.where({$_.name -eq $ruleName}).vbs) # Function (?<V1>\w*)
$r_ps=$($rules.where({$_.name -eq $ruleName}).ps) # {"Function $1() `{`n"}
if( $regex = ($line | select-string -pattern $r_vbs )) {
$0=$regex[0].Matches.Groups.Where({$_.name -eq "0"}).value # Function InitializeApp
$1=$regex[0].Matches.Groups.Where({$_.name -eq "V1"}).value # InitializeApp
$2=$regex[0].Matches.Groups.Where({$_.name -eq "V2"}).value #
$r_ps = & $r_ps # Function InitializeApp() {
$replace = $line.replace($0,$r_ps) # Function InitializeApp -> Function InitializeApp() {
} else {$replace = $line} #keep old value
return $replace
}
$newVBS=@()
foreach($line in $vbs){
$line = Invoke-TestAndReplace -line $line -rulename "func_start"
}