我试图从文本文件中读取值,并将其作为变量保留在脚本中使用。
此配置文件包含字符串,整数, bool(boolean) 值和可以包含字符串,整数和 bool(boolean) 值的数组。
当我直接声明变量时,我没有问题。我的脚本按预期运行。但是,当我读取配置文件并尝试基于该文件创建变量时,我只会得到声明为字符串的变量。
这将以我想要的格式创建我的配置文件。
Function Create-Config() {
If (!(Test-Path config.txt)) {
$currentlocation=Get-Location
$parentfolder=(get-item $currentlocation).parent.FullName
New-Item config.txt -ItemType "file"
Add-Content config.txt "SERVER_NAME=MyServer"
Add-Content config.txt "SERVER_LOCATION=$currentlocation"
Add-Content config.txt "BACKUP_LOCATION=$parentfolder\backup"
Add-Content config.txt "CRAFTBUKKIT=craftbukkit.jar"
Add-Content config.txt "JAVA_FLAGS=-Xmx1G"
Add-Content config.txt "CRAFTBUKKIT_OPTIONS=-o True -p 1337"
Add-Content config.txt "TEST_DEPENDENCIES=True"
Add-Content config.txt "DELETE_LOG=True"
Add-Content config.txt "TAKE_BACKUP=True"
Add-Content config.txt "RESTART_PAUSE=5"
}
}
但是,我要么需要更改创建配置文件的方式,要么需要更改导入这些变量的方式。我希望配置文件尽可能简单。我正在使用此代码导入值:
Function Load-Variables() {
Get-Content config.txt | Foreach-Object {
$var = $_.Split('=')
New-Variable -Name $var[0] -Scope Script -Value $var[1]
}
}
如您所见,我没有显式设置变量,因为配置中的变量是不同的类型( bool(boolean) 值,整数,数组,字符串)。但是,PowerShell将所有这些都导入为字符串。我可以单独导入所有变量(可能必须这样做),但是我仍然觉得自己会卡在数组上。
如果我使用以下命令声明数组:
New-Variable -Name CRAFTBUKKIT_OPTIONS -Option Constant -Value ([array]@('-o',$true,'-p',25565))
我得到的正是我想要的,但是我需要从配置文件中导入它,而不是在脚本中声明变量。 Java程序有点挑剔,因此我不能只是将该值作为字符串导入,否则将无法正确传递,并且这些选项将被忽略。我发现它唯一可行的方法是将其作为数组(如上定义)。我还想指出的是,与我的示例相比,可能提供了更多的配置文件选项。
我不确定什么是更好的方法-导入要正确声明的变量(我想做的事情),或者假定它们不能以字符串以外的任何形式导入,然后将字符串解析为适当的变量类型。
我尝试过事先声明变量,并使用Set-Variable命令设置值,但这不起作用。似乎我的变量从一开始就通过Get-Content作为字符串而不是正确的类型导入。
完整脚本在这里:
https://gist.github.com/TnTBass/4692f2a00fade7887ce4
最佳答案
有什么帮助吗?
$types = @{
SERVER_NAME = {$args[0]}
SERVER_LOCATION = {$args[0]}
BACKUP_LOCATION = {$args[0]}
CRAFTBUKKIT = {$args[0]}
JAVA_FLAGS = {$args[0]}
CRAFTBUKKIT_OPTIONS = { ($args[0].split(' ')[0] -as [string]),
([bool]::Parse($args[0].split(' ')[1])),
($args[0].split(' ')[2] -as [string]),
($args[0].split(' ')[3] -as [int]) }
TEST_DEPENDENCIES = {[bool]::Parse($args[0])}
DELETE_LOG = {[bool]::Parse($args[0])}
TAKE_BACKUP = {[bool]::Parse($args[0])}
RESTART_PAUSE = {$args[0] -as [int]}
}
$ht = [ordered]@{}
gc config.txt |
foreach {
$parts = $_.split('=').trim()
$ht[$parts[0]] = &$types[$parts[0]] $parts[1]
}
New-object PSObject -Property $ht
SERVER_NAME : MyServer
SERVER_LOCATION : C:\testfiles
BACKUP_LOCATION : C:\\backup
CRAFTBUKKIT : craftbukkit.jar
JAVA_FLAGS : -Xmx1G
CRAFTBUKKIT_OPTIONS : {-o, True, -p, 1337}
TEST_DEPENDENCIES : True
DELETE_LOG : True
TAKE_BACKUP : True
RESTART_PAUSE : 5
$ types哈希表使用配置文件中的参数名称作为键,并使用脚本块定义需要对从文件中读取的参数的字符串值进行的键入和数据转换。从文件中读取每一行时,脚本的这一部分:
$parts = $_.split('=').trim()
$ht[$parts[0]] = &$types[$parts[0]] $parts[1]
将其分割为'=',然后查找该参数的脚本块并使用该值作为其参数来调用它。结果存储在哈希表($ ht)中,然后用于创建对象。您可以省略对象的创建,而仅使用哈希表来传递配置值(如果更适合您的应用程序)。
您可能需要添加一些错误陷阱,以测试生产工作的输入数据和/或结果值。但是我认为脚本块的哈希表是呈现输入和转换的一种非常干净的方法,并且如果需要进行更改,应该相当直观易读并且易于在脚本中维护。前5个参数是字符串参数,它们按原样返回,但是为了清楚起见,您可以在脚本块中将它们显式转换为[string]。
关于powershell - 从配置文件[PowerShell]中读取时分配适当的变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19866170/