Powershell:强制可变扩展

时间:2014-04-11 20:42:05

标签: powershell

如何强制字符串变量扩展?

我需要读取一个包含一个或多个变量名的字符串(模板),然后在读取文件后展开它。关键是我必须在声明将在扩展中使用的变量之前读取文件的内容。我尝试了几种方法,但我无法使用它。

在定义$ 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现在正在为我工​​作。

3 个答案:

答案 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