Дополнительные символы при запуске скрипта как локальной системы - PullRequest
0 голосов
/ 08 июля 2019

У меня есть скрипт с парой функций.Первая функция создает несколько ключей реестра в HKLM \ Software \ Test (\ UDF1-30).Вторая функция берет любые строки, записанные в ключах UDF #, объединяет их (одна строка в UDF, разделенных символом канала) и копирует их в HKLM \ Software \ CentraStage \ Custom #.

Для тестирования ябросил следующую строку в UDF12:

PatchSched:{"StartTime":"23:00:00","TzBias":-480,"Duration":240,"DayOfYear":[],"DayOfWeek":[-2],"Days":[],"MonthlyDayOfWeek":[6],"Months":[1,2,3,4,5,6,7,8,9,10,11,12],"Ordering":[4],"ScheduleType":7}

Когда я запускаю скрипт от имени локального администратора, я получаю эту же строку в Custom12.Но когда я запускаю скрипт как локальная система, я получаю случайные каналы в строке:

PatchSched:{"StartTime":"23:00:00","TzBias":-480,"Duration":240,"DayOfYear":[],"DayOfWeek":[-2],"Days":[],"MonthlyD|ayOfWeek":[6],"Months":[1,2,3,4,5,6,7,8,9,10,11,12],"Ordering":[4],"ScheduleType":7}

Почему в мире это может произойти?Вот сценарий:

Function Add-UserDefinedFields {
    <#
        .DESCRIPTION
            This function checks if HKLM\SOFTWARE\Test exists. If not, it creates the required registry structure, to support Update-UserDefinedFields.
    #>

    Set-Location HKLM:

    If (-Not(Test-Path .\Software\Test\UDF29)) {
        # If the Test registry key does not exist...
        # Create the Test registry key.
        New-Item -Path .\Software -Name Test

        # Create 30 UDF registry keys.
        For ($i = 1; $i -le 30; $i++) {
            New-Item -Path .\Software\Test -Name UDF$i
        }
    }
}

Function Update-UserDefinedFields {
    <#
        .DESCRIPTION
            This function reads the value of each UDF registry entry, in HKLM\SOFTWARE\Test and writes the value(s) to the corresponding UDF in HKLM\SOFTWARE\CentraStage.
    #>

    Set-Location HKLM:

    For ($i = 1; $i -le 30; $i++) {
        # For each of the 30 UDF registry keys...

        # Initialize variable.
        $udfValue = New-Object "System.Collections.Generic.List[string]"

        Get-ItemProperty .\SOFTWARE\Test\UDF$i -ErrorAction SilentlyContinue | Out-String -Stream | Where-Object { $_ -NOTMATCH '^ps.+' } | ForEach-Object {
            $udfValue.Add($_)
        }

        $udfString = $udfValue -join '|'

        $udfString = $udfString.Replace(' ', '')
        While ($udfString -like "*||*") {
            $udfString = $udfString.replace('||', '|')
        }

        If ($udfString) {
            # Trim the leading and trailing characters (|).
            $udfString = $udfString.substring(1, $udfString.length - 2)
        }

        Write-Host ("Writing to UDF{0}: {1}" -f $i, $udfString)

        # For each Test UDF, write the concatinated value to the corresponding AEM UDF registry location.
        $null = New-ItemProperty -Path .\SOFTWARE\CentraStage -Name Custom$i -PropertyType String -Value $udfstring -Force -ErrorAction SilentlyContinue
    }
}

Add-UserDefinedFields
Update-UserDefinedFields

1 Ответ

0 голосов
/ 15 июля 2019

Хорошо, я понял это. Код теперь выглядит так:

    Function Add-TestUserDefinedFields {
    <#
        .DESCRIPTION
            This function checks if HKLM\SOFTWARE\Test exists. If not, it creates the required registry structure, to support Update-UserDefinedFields.
    #>

    Set-Location HKLM:

    If (-Not(Test-Path .\Software\Test\UDF29)) {
        # If the Test registry key does not exist...
        # Create the Test registry key.
        New-Item -Path .\Software -Name Test

        # Create 30 UDF registry keys.
        For ($i = 1; $i -le 30; $i++) {
            New-Item -Path .\Software\Test -Name UDF$i
        }
    }
}

Function Update-UserDefinedFields {
    <#
        .DESCRIPTION
            This function reads the value of each UDF registry entry, in HKLM\SOFTWARE\Test and writes the value(s) to the corresponding UDF in HKLM\SOFTWARE\CentraStage.
    #>

    Set-Location HKLM:

    For ($i = 1; $i -le 30; $i++) {
        # For each of the 30 UDF registry keys...

        # Initialize variable.
        $udfValue = New-Object "System.Collections.Generic.List[string]"

        (Get-ItemProperty .\SOFTWARE\Test\UDF$i -ErrorAction SilentlyContinue).PSObject.Properties | Where-Object { $_.Name -NOTMATCH '^ps.+' } | ForEach-Object {
            $udfValue.Add("$($_.Name):$($_.Value)")
        }

        $udfString = $udfValue -join '|'

        Write-Output ("The value of `$udfString is {0}" -f $udfString) | out-file C:\Synoptek\test.txt -Append

        $udfString = $udfString.Replace(' ', '')
        While ($udfString -like "*||*") {
            $udfString = $udfString.replace('||', '|')
        }

        Write-Output ("Writing to UDF{0}: {1}" -f $i, $udfString)

        # For each Test UDF, write the concatinated value to the corresponding  UDF registry location.
        $null = New-ItemProperty -Path .\SOFTWARE\CentraStage -Name Custom$i -PropertyType String -Value $udfstring -Force -ErrorAction SilentlyContinue
    }
}

Add-TestUserDefinedFields
Update-UserDefinedFields
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...