刷新变量的内容

时间:2015-10-14 14:39:06

标签: sql powershell

正如另一篇文章所述,我可以在像

这样的脚本中包含ps1-parameter-files
. $PSScriptRoot/ParaFolder/MyParameters.ps1

我定义了一些我经常需要的参数,通常不会改变。如果我必须更改它们,我只能在此参数文件中执行此操作,而不是更改多个脚本。 此外,我添加了一个包含简单insert-sql语句的变量,用于记录原因,如:

$parafield1 = 'test'
$parafield2 = 'default'
$parafield3 = 'name'
$parafield4 = 'testtest'
$myloggingSQL = "INSERT INTO [dbo].[mytable] 
                           (field1, field2, field3, field4) 
                    VALUES (current_timestamp, '$parafield1', '$parafield2',
                            '$parafield2', '$parafield4')

$ myloggingSQL上面定义的变量应该像默认值一样。因此,用户不必在他的脚本中填写所有这些内容。

$parafield2 = 'userspecifictext'
$parafield4 = 'i am happy today'    
$Command.CommandText = $myloggingSQL 
$Reader = $Command.ExecuteReader()

当然它不像上面解释的那样工作,因为$ myloggingSQL在包含时已经填充了默认值。 所以我正在考虑将insert语句保存在另一个文件中,以便能够像以下一样工作:

. $PSScriptRoot/ParaFolder/MyParameters.ps1
Do calculations and so on...
$parafield2 = 'userspecifictext'
$parafield4 = 'i am happy today'
. $PSScriptRoot/ParaFolder/myLoggingSQLFile.ps1 
$Command.CommandText = $myloggingSQL 
$Reader = $Command.ExecuteReader()

当包含myLoggingSQLFile.ps1时,SQL将填充$ parafield *变量的内容,最后写入我的数据库。 但这似乎只是一个初学者(像我一样)的快速和肮脏的解决方案。

有人知道如何以专业的方式解决这个问题吗? 也许我对powershell这个话题太新了,或者今天太累了,无法找到合适且面向未来的解决方案。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您应该使用脚本模块完成此操作并使用函数生成查询字符串。要创建模块,可以将代码放入gfs.files.findOne({"filename":"test.png"}, callback.wrap(function (image) { console.log(image.filename); temp.open({suffix: image.filename}, function (err, info) { if (err) { console.log(err); } var stream = gfs.createReadStream({_id: image._id}); fs.write(info.fd, stream, 'binary'); fs.close(info.fd, function () { //doc.image(info.path); }); }); }); 文件中,然后导出要共享的内容。然后,您可以使用doc将其带入脚本而不是点源。

使函数返回查询字符串的值允许您更多地参数化它。通过将原始值用作默认值,您可以显式覆盖它们中的任何一个。

模块的内容如下所示:

.psm1

现在在您的脚本中,您可以执行此操作:

Import-Module

现在假设您要覆盖整个脚本的值,并且不想继续指定$parafield1 = 'test' $parafield2 = 'default' $parafield3 = 'name' $parafield4 = 'testtest' function Get-MyLoggingSql { [CmdletBinding()] param( [String] $Field1 = $parafield1 , [String] $Field2 = $parafield2 , [String] $Field3 = $parafield3, [String] $Field4 = $parafield4 ) "INSERT INTO [dbo].[mytable] (field1, field2, field3, field4) VALUES (current_timestamp, '$Field1', '$Field2', '$Field3', '$Field4')" } Export-ModuleMember -Function *-* Import-Module $PSScriptRoot/ParaFolder/MyParameters.ps1 $parafield2 = 'userspecifictext' $parafield4 = 'i am happy today' $Command.CommandText = Get-MyLoggingSql -Field2 $parafield2 -Field4 $parafield4 $Reader = $Command.ExecuteReader()

在这种情况下,请使用PowerShell's built in $PSDefaultParameterValues variable

-Field2

请注意,这需要PowerShell 3.0 +。