如何强制字符串变量扩展?
我需要读取一个包含一个或多个变量名的字符串(模板),然后在读取文件后展开它。关键是我必须在声明将在扩展中使用的变量之前读取文件的内容。我尝试了几种方法,但我无法使用它。
在定义$ environment之后,它不是读取文件的选项。
name.txt的内容: $环境-RPT-INT
#example 1
$name = gc "c:\temp\name.txt"
$environment = "9065DEV"
$expanded = $ExecutionContext.InvokeCommand.ExpandString($name)
$expanded
#example 2
$name = gc "c:\temp\name.txt"
$environment = "9065DEV"
$expanded = $expanded = Invoke-Expression "`"$template`""
$expanded
#example 3
$name = gc "c:\temp\name.txt"
$environment = "9065DEV"
$name = $name.Clone()
$expanded = $ExecutionContext.InvokeCommand.ExpandString($name)
$expanded
感谢任何帮助。
更新:示例1现在正在为我工作。
答案 0 :(得分:3)
看起来您已经找到了一些可能的解决方案,但我建议另一个在我看来更智能,更强大的解决方案。
为什么不使用格式说明符,而不是在文本文件中要求变量名。例如,name.txt的内容:
{0}-RPT-INT
在你的剧本中:
$name = gc "c:\temp\name.txt"
$environment = "9065DEV"
$expanded = $name -f $environment
$expanded
这样,您可以重命名变量,而无需更改任何文本文件。作为奖励,如果您的文本文件来自未知来源,您的脚本很容易受到代码注入。例如,假设您有一个包含以下内容的文本文件:
$(rm -whatif -recurse -force c:\)-RPT-INT
然后,ExpandString或Invoke-Expression将很乐意执行该代码。
答案 1 :(得分:2)
您的Invoke-Expression
示例非常接近。不过使用$template
,您需要使用$name
。
#example 2
$name = gc 'c:\temp\name.txt';
$environment = '9065DEV';
$expanded = Invoke-Expression -Command "`"$name`"";
$expanded;
答案 2 :(得分:0)
如果您愿意将设置/值存储在CSV中,我编写了一个模块以从CSV中提取值,将其放入HereString中...您放入CSV中的任何变量都将在Here-中完全展开串。这样,您通常可以解决字段名称和值。
如果有人感兴趣的话,我也许可以将其更改为也可以与传统INI一起使用。
https://github.com/Inventologist?tab=repositories
寻找:HereStringFromCSV