Можно ли добавить все переменные как глобальные внутри функции? Все остальные функции их получат? Я сделал короткий тест, и он должен работать. Должен ли я добавить 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 переменные для каждой версии?
Я приведу пример:
Каждый раз включается только один набор (согласно версии, над которой я хочу работать)
Использование этих параметров:
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, без вставляем вручную номер
Я надеюсь, что это сделает работу
do {$VersionToUse = $Versions.buildver | Out-Gridview -Title "Choose version" -PassThru } while ($Versions.buildver -notcontains $VersionToUse)
Каждая переменная используется в сценарии. Например, $var1 — это путь к версии. $var2 — это заголовок элемента тега. $var3 — это идентификатор конвейера. для каждого прогона мне нужно каждый раз активировать еще 4 параметра
И как они используются? Вы передаете их в качестве аргументов одной или нескольким функциям/командам? (подсказка: было бы намного проще вам помочь, если бы вы разместили свой скрипт)
Добавлю скрипт. У меня 1000 строк... Я передаю их функциям и командам
Вы можете сохранить и выбрать его таким образом с помощью хеш-таблицы:
$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:\
Обновлено: добавлен новый ответ, поскольку в ОП поступило больше информации.
Спасибо, Ан-Дир, за ответ. Я отредактировал вопрос. Я не знаю, смогу ли я использовать ваше решение. Если это не так, пожалуйста, скажите мне, как, спасибо
Спасибо за ваше обновление, но я все еще не уверен, правильно ли я понял: D
Обновлено: полностью изменил этот ответ, чтобы включить последнюю информацию
Теперь пользователь скрипта увидит версии для выбора, а затем введет номер версии, которая будет использоваться. затем ваши четыре переменные заполняются соответствующими данными.
$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
У меня нет файла конфигурации.
Где у вас есть переменные, которые вы показываете на скриншоте?
Вверху у меня есть 4 переменные X 3 версии. Я хочу изменить только одну переменную в одном месте для каждой версии, а не изменять вручную все четыре. Или еще лучше, если я спрошу пользователя, над какой версией он хочет работать: 1 для 8.5.34 2 для 8.5.35 После того, как он выберет правильную версию, соответствующие переменные определят
На сегодняшний день я не могу обновить код, но вы можете разгрузить переменные, как показано на скриншоте, и использовать мой скрипт как есть. Просто переместите содержимое в новый файл и включите его, например «. .\VersionDataFile.ps1».
Буду признателен, если вы обновите код, потому что я не понимаю, как его использовать. Спасибо. У пользователя будет возможность выбрать, над какой версией работать?
Это тоже нужно использовать? $myVars = @{} $myVars.Version2000 = @{"Path" = "c:\";"Title" = "MySensitiveData"} $myVars.Version2000.Path $myVars.Version2000.Title
Можете ли вы уточнить, какие файлы мне нужно создать? Что должно быть в файлах ps1 и txt и как я их называю
я думаю, теперь должно быть ясно, что делать, и я надеюсь, что это то, что вам нужно
Большое тебе спасибо. Есть ли возможность позволить пользователю выбирать из списка? Вместо того, чтобы позволить ему вставить версию вручную? Как 1 для: 8.5.34 и в следующем ряду 2 для: 8.5.35
Ключ здесь $VersionNumber? На базе какая версия выбрана?
Список будет простым, если вы используете Out-Gridview для $Versions.VersionNumber и передадите выбор в $VersionToUse, которая является переменной, используемой для определения того, какие данные предназначены для четырех необходимых вам переменных.
Спасибо, Ан-дир. Можете ли вы помочь мне с этим? :)
Я не знаю, как это сделать и когда разместить это в сценарии
Строка $Versions = $Versions | ConvertFrom-CSV -Del ";" показывает все параметры. Я хотел бы показать только билдвер (4 ряда) и дать пользователю выбрать (не вставлять вручную) 1. 8.5.34 2. 8.5.35 3. 8.6.22 А он вставит 1 или 2 или 3
Изменил одну строку, чтобы соответствовать вашим потребностям.
Пожалуйста, еще один вопрос. Функция работает и получает параметры, но все переменные заданы только в этой функции. Мне нужно пройти. к другой функции. Как я могу это сделать?
Я обновил сценарий относительно моего последнего вопроса. Можно ли добавить все переменные как глобальные внутри функции? Все остальные функции их получат?
глобальная область может делать то, что вы хотите. вам следует узнать больше о powershell, если вы используете его в производственной среде, поскольку вы можете столкнуться с неожиданным поведением в рабочей и жилой среде. вы всегда должны хотя бы мельком взглянуть на документацию. Здесь у меня есть ссылка для вас об областях (глобальная) docs.microsoft.com/en-us/powershell/module/… Также посмотрите на использование-точечной-исходной-нотации-с-областью на том же сайте, который может повлиять на то, как вы можете использовать свои переменные
Похоже, вам нужно параметризовать вашего скрипта :) Можете ли вы показать пример 4 переменных, которые вы в настоящее время определяете в верхней части скрипта?