gpt4 book ai didi

c# - 在PowerShell中使用C#源代码进行转换

转载 作者:行者123 更新时间:2023-12-03 01:18:40 24 4
gpt4 key购买 nike

我正在编写的PowerShell脚本中有一个自定义C#方法。该函数的目的是找出文件中是否存在特定行。这是我的资料来源:

$source = @"
using System;

public class Differ
{
public static bool isInFile(Array file, String line)
{
foreach(string curLine in file)
{
if(curLine.Replace(" ", "") == line.Replace(" ", ""))
{
return true;
}
}

return false;
}
}
"@

Add-Type -TypeDefinition $source

$file1 = Get-Content "path\to\file"
$file2 = Get-Content "path\to\file"

$diff = New-Object System.Collections.Specialized.OrderedDictionary

$lineNumber = 0
$file1 | foreach {
[String]$theLine = $_

if ([Differ]::isInFile([Array]$file2, [String]$theLine) -eq $false -and -not [System.String]::IsNullOrWhiteSpace($theLine)) {
$diff.Add($lineNumber, $_.ToString().Trim())
}

$lineNumber++
}

$diffHeader = @{Expression={$_.Name};Label="Line"}, `
@{Expression={$_.Value};Label="Content"}

$diff | Sort-Object Line | Format-Table $diffHeader -AutoSize

运行脚本时,它给我以下错误:
Exception calling "isInFile" with "2" argument(s): "Unable to cast object of type 'System.Management.Automation.PSObject' to type 'System.String'."
At C:\Users\jcarl\Dropbox\PowerShell\compare_config\comapre.ps1:33 char:9
+ if ([Differ]::isInFile([Array]$file2, [String]$theLine) -eq $false) {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : InvalidCastException

我猜想在我要传递给isInFile的第二个对象上出错,但是我不确定。我已经验证PowerShell可以将两个文件正确地加载到它们的变量中,并且$ theLine变量中有一个字符串。

最佳答案

您的函数声明错误。您需要使用string[]而不是Array。更换:

public static bool isInFile(Array file, String line)


public static bool isInFile(string[] file, String line)

PS代码([string]和[array])中的强制类型转换是不必要的。

就我个人而言,我只是跳过C#并使用像这样的内置powershell运算符。比较干净我宁愿只在需要减少尽可能多的纳秒时才加载C#代码,但是话又说回来,编译应用程序对此会更好:-)试试:
$file1 = Get-Content "path\to\file"
$file2 = Get-Content "path\to\file"

$diff = New-Object System.Collections.Specialized.OrderedDictionary

$lineNumber = 0
$trimmedfile2 = $file2 | % { $_ -replace " " }

$file1 | foreach {

if($trimmedfile2 -notcontains ($_ -replace " ") -and -not [System.String]::IsNullOrWhiteSpace($_)) {
$diff.Add($lineNumber, $_.Trim())
}

$lineNumber++
}

$diffHeader = @{Expression={$_.Name};Label="Line"}, @{Expression={$_.Value};Label="Content"}

$diff | Sort-Object Line | Format-Table $diffHeader -AutoSize

关于c# - 在PowerShell中使用C#源代码进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22544715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com