Powershell управляет набором переменных

Можно ли добавить все переменные как глобальные внутри функции? Все остальные функции их получат? Я сделал короткий тест, и он должен работать. Должен ли я добавить Get-Variable -ValueOnly...?

$ReleaseVersion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).ReleaseVersion
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$LinkForVersion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).LinkForVersion
$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$buildver = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildver
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$xmlFilePath = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).xmlFilePath
$ReleaseBuildVer = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).ReleaseBuildVer

Set-Variable -Name "ReleaseVersion" -Value $ReleaseVersion -Scope global
Set-Variable -Name "Sourceversion" -Value $Sourceversion -Scope global
Set-Variable -Name "LinkForVersion" -Value $LinkForVersion -Scope global
Set-Variable -Name "VersionNumber" -Value $VersionNumber -Scope global
Set-Variable -Name "buildver" -Value $buildver -Scope global
Set-Variable -Name "PipelineID" -Value $PipelineID -Scope global
Set-Variable -Name "xmlFilePath" -Value $xmlFilePath -Scope global
Set-Variable -Name "ReleaseBuildVer" -Value $ReleaseBuildVer -Scope global

}

У меня есть скрипт, который читает из excel, собирает файлы по столбцу. Перед запуском мне нужно определить 4 переменные, проблема в том, что мне нужно запустить его для нескольких версий. Это означает, что для каждого запуска мне нужно оставить активными 4 переменные, а остальные должны быть в комментарии (#) и я делаю это вручную (нужно добавить 12 раз # Есть ли разумный способ выбрать все 4 переменные для каждой версии?

Я приведу пример:

Powershell управляет набором переменных

Каждый раз включается только один набор (согласно версии, над которой я хочу работать)

Использование этих параметров:

Add-VSTeamWorkItem -ProjectName "Client-Server" -Title "[Side VIP] [$VersionNumber]"

$Versionlocationforpatches = "$Sourceversion\Installer\Patches" 
$Versionlocationforcabs = "$Sourceversion\Installer" 

Add-VSTeamBuild -ProjectName "Client-Server" -BuildDefinitionId $PipelineID

function RenameVerFile ([string] $buildver) 
{
    $DefaultFile = Get-ChildItem $Sourceversion | Where-Object {$_.Name -like "BuildVer.txt"}
    Clear-Content $DefaultFile.FullName -Force 
    $Newcontent = Add-Content $DefaultFile.FullName -Value ($buildver + "." + (Get-Random)) 
    
}

Некоторые из них используются в других местах

Теперь у меня есть что-то вроде этого, и я очень счастлив, но я хочу отобразить пользователю меню, например: Для версии 8.5.34 выбираем 1, без вставляем вручную номер

Powershell управляет набором переменных

Я надеюсь, что это сделает работу

do {$VersionToUse = $Versions.buildver | Out-Gridview -Title "Choose version" -PassThru } while ($Versions.buildver -notcontains $VersionToUse)

Похоже, вам нужно параметризовать вашего скрипта :) Можете ли вы показать пример 4 переменных, которые вы в настоящее время определяете в верхней части скрипта?

Mathias R. Jessen 16.03.2022 20:53

Каждая переменная используется в сценарии. Например, $var1 — это путь к версии. $var2 — это заголовок элемента тега. $var3 — это идентификатор конвейера. для каждого прогона мне нужно каждый раз активировать еще 4 параметра

Bandit 16.03.2022 21:00

И как они используются? Вы передаете их в качестве аргументов одной или нескольким функциям/командам? (подсказка: было бы намного проще вам помочь, если бы вы разместили свой скрипт)

Mathias R. Jessen 16.03.2022 21:02

Добавлю скрипт. У меня 1000 строк... Я передаю их функциям и командам

Bandit 16.03.2022 21:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сохранить и выбрать его таким образом с помощью хеш-таблицы:

$myVars = @{}
$myVars.Version2000 = @{"Path" = "c:\";"Title" = "MySensitiveData"}
$myVars.Version2000.Path
$myVars.Version2000.Title

тогда это может выглядеть

PS C:\> $myVars = @{}
PS C:\> $myVars.Version2000 = @{
>> "Path" = "c:\Prog2000"
>> "Title" = "MySensitiveData"
>> "Var3" = "Value3"
>> "Var4" = "value4"
>> }
PS C:\> $myVars.Version2013 = @{
>> "Path" = "c:\Prog2013"
>> "Title" = "MySensitiveData"
>> "Var3" = "Value3"
>> "Var4" = "value4"
>> }
PS C:\> $myVars.Version2000

Name                           Value
----                           -----
Var4                           value4
Path                           c:\
Var3                           Value3
Title                          MySensitiveData
PS C:\> $myVars.Version2000.Path
c:\

Обновлено: добавлен новый ответ, поскольку в ОП поступило больше информации.

Спасибо, Ан-Дир, за ответ. Я отредактировал вопрос. Я не знаю, смогу ли я использовать ваше решение. Если это не так, пожалуйста, скажите мне, как, спасибо

Bandit 17.03.2022 07:15

Спасибо за ваше обновление, но я все еще не уверен, правильно ли я понял: D

An-dir 17.03.2022 09:04
Ответ принят как подходящий

Обновлено: полностью изменил этот ответ, чтобы включить последнюю информацию

Теперь пользователь скрипта увидит версии для выбора, а затем введет номер версии, которая будет использоваться. затем ваши четыре переменные заполняются соответствующими данными.

$SharedDriveFolderPath= "\\Test\xxx" # This is just for me to test - you have your own data somewhere
$Versions = @()
$Versions += "VersionNumber;Sourceversion;PipelineID;buildvers;"
$Versions += "8.5.34;$SharedDriveFolderPath\Versions\8.5.34.31;18710;8.5.34.31"
$Versions += "8.5.35;$SharedDriveFolderPath\Versions\8.5.34.35;18713;8.5.34.35"
$Versions = $Versions | ConvertFrom-CSV -Del ";"

do {$VersionToUse = ($Versions | Out-GridView -OutputMode Single -Title "Select version to use").VersionNumber} while (-not $VersionToUse)

$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$buildvers = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildvers

Возьмите этот код, чтобы заменить строки вашей версии (те, которые вы разместили здесь в качестве примера снимка экрана)

Альтернатива json, если вы предпочитаете это:

$SharedDriveFolderPath= "\\Test\xxx" # This is just for me to test - you have your own data somewhere
$Versions = @"
[
    {
        "VersionNumber":  "8.5.34",
        "Sourceversion":  "$($SharedDriveFolderPath -replace "\\","\\")\\Versions\\8.5.34.31",
        "PipelineID":  "18710",
        "buildvers":  "8.5.34.31"
    },
    {
        "VersionNumber":  "8.5.35",
        "Sourceversion":  "$($SharedDriveFolderPath -replace "\\","\\")\\Versions\\8.5.34.35",
        "PipelineID":  "18713",
        "buildvers":  "8.5.34.35"
    }
]
"@ | ConvertFrom-Json

do {$VersionToUse = ($Versions | Out-GridView -OutputMode Single -Title "Select version to use").VersionNumber} while (-not $VersionToUse)

$VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber
$Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion
$PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID
$buildvers = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildvers

Замените строку, начинающуюся с «do», на следующий код, чтобы получить другой способ выбора, если вам не нравится вид сетки.

$i = 0; foreach ($Version in $Versions.VersionNumber) {$i++; "[$i] $Version"; }; $VersionToUse = ($Versions[$(do {"Enter ID of Version to use"; $id = Read-Host} while (-not ($id -le $Versions.count -and $id -gt 0));$id - 1)]).VersionNumber

У меня нет файла конфигурации.

Bandit 17.03.2022 14:07

Где у вас есть переменные, которые вы показываете на скриншоте?

An-dir 17.03.2022 14:09

Вверху у меня есть 4 переменные X 3 версии. Я хочу изменить только одну переменную в одном месте для каждой версии, а не изменять вручную все четыре. Или еще лучше, если я спрошу пользователя, над какой версией он хочет работать: 1 для 8.5.34 2 для 8.5.35 После того, как он выберет правильную версию, соответствующие переменные определят

Bandit 17.03.2022 14:17

На сегодняшний день я не могу обновить код, но вы можете разгрузить переменные, как показано на скриншоте, и использовать мой скрипт как есть. Просто переместите содержимое в новый файл и включите его, например «. .\VersionDataFile.ps1».

An-dir 17.03.2022 14:23

Буду признателен, если вы обновите код, потому что я не понимаю, как его использовать. Спасибо. У пользователя будет возможность выбрать, над какой версией работать?

Bandit 17.03.2022 14:32

Это тоже нужно использовать? $myVars = @{} $myVars.Version2000 = @{"Path" = "c:\";"Title" = "MySensitiveData"} $myVars.Version2000.Path $myVars.Version2000.Title

Bandit 17.03.2022 15:03

Можете ли вы уточнить, какие файлы мне нужно создать? Что должно быть в файлах ps1 и txt и как я их называю

Bandit 18.03.2022 07:12

я думаю, теперь должно быть ясно, что делать, и я надеюсь, что это то, что вам нужно

An-dir 18.03.2022 11:45

Большое тебе спасибо. Есть ли возможность позволить пользователю выбирать из списка? Вместо того, чтобы позволить ему вставить версию вручную? Как 1 для: 8.5.34 и в следующем ряду 2 для: 8.5.35

Bandit 18.03.2022 14:24

Ключ здесь $VersionNumber? На базе какая версия выбрана?

Bandit 18.03.2022 15:09

Список будет простым, если вы используете Out-Gridview для $Versions.VersionNumber и передадите выбор в $VersionToUse, которая является переменной, используемой для определения того, какие данные предназначены для четырех необходимых вам переменных.

An-dir 18.03.2022 15:36

Спасибо, Ан-дир. Можете ли вы помочь мне с этим? :)

Bandit 18.03.2022 15:46

Я не знаю, как это сделать и когда разместить это в сценарии

Bandit 18.03.2022 16:43

Строка $Versions = $Versions | ConvertFrom-CSV -Del ";" показывает все параметры. Я хотел бы показать только билдвер (4 ряда) и дать пользователю выбрать (не вставлять вручную) 1. 8.5.34 2. 8.5.35 3. 8.6.22 А он вставит 1 или 2 или 3

Bandit 18.03.2022 16:47

Изменил одну строку, чтобы соответствовать вашим потребностям.

An-dir 19.03.2022 00:53

Пожалуйста, еще один вопрос. Функция работает и получает параметры, но все переменные заданы только в этой функции. Мне нужно пройти. к другой функции. Как я могу это сделать?

Bandit 21.03.2022 17:24

Я обновил сценарий относительно моего последнего вопроса. Можно ли добавить все переменные как глобальные внутри функции? Все остальные функции их получат?

Bandit 21.03.2022 18:25

глобальная область может делать то, что вы хотите. вам следует узнать больше о powershell, если вы используете его в производственной среде, поскольку вы можете столкнуться с неожиданным поведением в рабочей и жилой среде. вы всегда должны хотя бы мельком взглянуть на документацию. Здесь у меня есть ссылка для вас об областях (глобальная) docs.microsoft.com/en-us/powershell/module/… Также посмотрите на использование-точечной-исходной-нотации-с-областью на том же сайте, который может повлиять на то, как вы можете использовать свои переменные

An-dir 22.03.2022 23:44

Другие вопросы по теме