Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 对每个noteproperty值进行字符串操作_String_Powershell_Foreach - Fatal编程技术网

String 对每个noteproperty值进行字符串操作

String 对每个noteproperty值进行字符串操作,string,powershell,foreach,String,Powershell,Foreach,尝试了许多不同的方法,试图让这个工作。这是我能想到的最接近的不起作用的例子 如果我还想去掉$and,我想去掉带有空值的NoteProperty项;对象中任何NoteProperty值中的字符,而将其余的值留在后面。有人能告诉我下面的代码示例有什么问题吗 $JournalObject | Get-Member -MemberType NoteProperty | ForEach-Object { if ($JournalObject.$_.Value -like ';') {

尝试了许多不同的方法,试图让这个工作。这是我能想到的最接近的不起作用的例子

如果我还想去掉$and,我想去掉带有空值的NoteProperty项;对象中任何NoteProperty值中的字符,而将其余的值留在后面。有人能告诉我下面的代码示例有什么问题吗

$JournalObject | Get-Member -MemberType NoteProperty | ForEach-Object {
    if ($JournalObject.$_.Value -like ';')
    {
    $JournalObject.$_.Value.Replace(';', '')
    }
    if ($JournalObject.$_.Value -like '$')
    {
    $JournalObject.$_.Value.Replace('$', '')
    }
    if ($JournalObject.$_.Value -eq $null)
    {
    $JournalObject.PSObject.Properties.Remove($_)
    }
}
最亲切的问候!!
希望你的帮助:)

一些需要注意的事情;如果您正在运行从
Get Member
获取其对象的替换,那么您一开始就没有触及原始对象

您可以通过运行另一个
Get Member
来查看这一点,其中您的
ForEach对象
将查看通过管道传递的内容(spoiler,它是
Microsoft.PowerShell.Commands.MemberDefinition

您还可以通过对一个带有1
Get Member
piped的字符串运行它,然后将其与另一个
Get Member
piped的字符串进行比较,更好地了解这一点:

“asfdasf”| Get Member
(这将返回预期的字符串类型)

VS

“asfdasf”| Get Member | Get Member
(这将作为MemberDefinition对象返回,因为您实际上是在获取Get Member结果的成员)


正在研究更好的方法,不久将更新此答案。

这就是我的想法。首先,您需要删除不返回的属性,这样您就不会在不再存在的成员上循环,方法是查找这些成员,然后使用
选择对象
排除这些成员

然后可以循环并修复这些值

$members = $JournalObject | Get-Member -MemberType NoteProperty | select -expandproperty name
$removelist = $JournalObject | % {
    foreach ($member in $members) {
        if ($_.$member -eq $null) {
            $member
        }
    }
}
$uremovelist = $removelist | select -unique
$prunedJournalObject = $JournalObject | select * -ExcludeProperty $uremovelist
$members = $prunedJournalObject | Get-Member -MemberType NoteProperty | select -expandproperty
$prunedJournalObject | % {
    foreach ($member in $members) {
        if ($_.$member -match ';') {
            $_.$member = $_.$member.Replace(';', '')
        }
        if ($_.$member -match '$') {
            $_.$member = $_.$member.Replace('$', '')
        }
    }
    $_
}

字符串在.NET中是不可变的,因此
String.Replace
不会修改字符串。也像“;”一样
-如“$”
将寻找精确匹配。请举例说明如何实现相同的目标?