正如另一篇文章所述,我可以在像
这样的脚本中包含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这个话题太新了,或者今天太累了,无法找到合适且面向未来的解决方案。 提前谢谢!
答案 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 +。