我有一个用于监视数据库的perl脚本,我正在尝试将其编写为powershell脚本.
在perl脚本中有一个函数可以读取错误日志并过滤掉重要的内容并将其返回.它还保存日志文件的当前位置,以便下次必须读取日志时,它可以从它离开的位置开始,而不是再次读取整个日志.这是通过使用tell函数完成的.
我有一个想法是使用Get-Content cmdlet,并在最后一个位置开始读取,处理每一行直到文件结尾,然后保存位置.
你知道任何技巧,以便我可以在阅读后获取日志文件中的位置并在特定位置开始读取.
或者是否有更好和/或更简单的方法来实现这一目标?
吉斯利
编辑:这必须通过脚本完成,而不是通过其他工具.
编辑:所以我正在使用.NET API,但它并不适合我.我在这里和这里找到了一个有用的链接
这是我到目前为止:
function check_logs{
param($logs, $logpos)
$count = 1
$path = $logs.file
$br = 0
$reader = New-Object System.IO.StreamReader("$path")
$reader.DiscardBufferedData()
$reader.BaseStream.Seek(5270, [System.IO.SeekOrigin]::Begin)
for(;;){
$line = $reader.ReadLine()
if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)}
if($line -eq $null -and $count -eq 0){break}
if($line -eq $null){$count = 0}
elseif($line.Contains('Error:')){
$l = $line.split(',')
Write-Host "$line $br"
}
}
Run Code Online (Sandbox Code Playgroud)
}
我还没有找到正确使用搜索功能的方法.有人能指出我正确的方向吗?
如果我运行它输出5270,但如果我运行这个我尝试在基本流中寻找的行,我得到:
2011-08-12 08:49:36.51 Logon Error: 18456, Severity: 14, State: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用.net API来搜索大型数据文件.出于某种原因,我无法使其发挥作用.这是我的代码:
function check_logs{
$pos = 8192
$count = 1
$path = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log\ERRORLOG.2'
$br = 0
$reader = [System.IO.File]::OpenText($path)
$reader.DiscardBufferedData()
$reader.BaseStream.Seek(0, [System.IO.SeekOrigin]::Begin)
for(;;){
$line = $reader.ReadLine()
if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)}
if($line -eq $null -and $count -eq 0){break}
if($line -eq $null){$count = 0}
elseif($line.Contains(' Error:')){
Write-Host "$line $br"
}
}
Run Code Online (Sandbox Code Playgroud)
}
如果我使用0作为搜索方法的参数,它会按预期从头开始搜索,但它也会在写入读取行之前将0写入控制台.例:
0
2011-08-31 09:26:36.31 Logon Error: 17187, Severity: 16, State: 1. 4101
2011-08-31 09:26:36.32 Logon Error: 17187, Severity: 16, State: 1. 4489
2011-08-31 09:26:38.25 …Run Code Online (Sandbox Code Playgroud) 我需要找出表中的图像列是否为空.我一直在尝试使用,CASE但我总是收到错误.
查询:
SELECT OutgoindDoc = CASE ReceivedData
WHEN null THEN 'null'
ELSE CONVERT(xml,(CONVERT(varbinary(max),ReceivedData)))
END
FROM ib_IncomingData
Run Code Online (Sandbox Code Playgroud)
而我得到的错误:
消息306,级别16,状态1,行1
除非使用IS NULL或LIKE运算符,否则无法比较或排序text,ntext和image数据类型.
我可以用什么来获得我需要的结果?
我试图将字符串的值放入字节数组而不更改字符.这是因为字符串实际上是数据的字节表示.
目标是将输入字符串移动到字节数组中,然后使用以下命令转换字节数组:
string result = System.Text.Encoding.UTF8.GetString(data);
Run Code Online (Sandbox Code Playgroud)
我希望有人可以帮助我,虽然我知道这不是一个很好的描述.
编辑:也许我应该解释一下,我正在研究的是一个带有文本框的简单窗体,用户可以将编码数据复制到其中,然后单击预览以查看解码数据.
编辑:多一点代码:(inputText是一个文本框)
private void button1_Click(object sender, EventArgs e)
{
string inputString = this.inputText.Text;
byte[] input = new byte[inputString.Length];
for (int i = 0; i < inputString.Length; i++)
{
input[i] = inputString[i];
}
string output = base64Decode(input);
this.inputText.Text = "";
this.inputText.Text = output;
}
Run Code Online (Sandbox Code Playgroud)
这是Windows窗体的一部分,它包含一个富文本框.这段代码不起作用,因为它不会让我将char类型转换为byte.但是,如果我将线路更改为:
private void button1_Click(object sender, EventArgs e)
{
string inputString = this.inputText.Text;
byte[] input = new byte[inputString.Length];
for (int i = 0; i < inputString.Length; i++)
{
input[i] = (byte)inputString[i]; …Run Code Online (Sandbox Code Playgroud)