Необходимо сохранить начальные нули в скрипте powershell

У меня есть сценарий, в котором я пытаюсь поместить свои учетные данные AWS на удаленный сервер с помощью сценария powershell.

Проблема, с которой я столкнулся: начальные нули идентификатора учетной записи AWS (один из аргументов сценария powershell) не сохраняются. Я новичок в скрипте PS. Требуется руководство по сохранению нулей идентификатора учетной записи.

Пример — AccountID — 000009876543 — Здесь ведущие нули не сохраняются, и на сервере создается запись без нулей. Однако 900000876543 успешно передан.

Скрипт -

$user = $args[7]  #userid   
$pass = $args[8]  #password
$pair = "$($user):$($pass)" #pair

$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair) 
$base64 = [System.Convert]::ToBase64String($bytes)

$basicAuthValue = "Basic $base64"

$headers = @{ Authorization = $basicAuthValue }


$c1=$args[0]
$path=$args[1]
$cert=$args[2]
$p1=$args[3]
$awsacct=$args[4] #account_id
$awsak=$args[5]   #access_key 
$awssk=$args[6]   #secret_key 



$body9="{`"project`": { `"href`": `"/tenants/$c1/projects/$p1`"},`"account`": {`"href`": `"/tenants/$c1/accounts/$awsacct`"},`"credential`":{ `"type`": `"key`",`"accessKey`": `""+$awsak+"`", `"secretKey`": `""+$awssk+"`"}}"

$r=Invoke-WebRequest -uri "$path/tenants/$c1/credentials/$awsak" -Headers $headers -Certificate $cert -ContentType application/json -Method PUT -Body $body9

$r.Content

person Sneha    schedule 26.12.2019    source источник
comment
Не используйте автоматическую переменную $args, вместо этого определите именованные параметры и определите $awsacct как строку: Param( $c1, $path, $cert, $p1, [String]$awsacct, $awsak, $awssk )   -  person iRon    schedule 26.12.2019
comment
@iRon Я запускаю этот скрипт на удаленном сервере, у нас есть встроенный PS, поэтому мы не можем определить именованные параметры. У нас есть аргументы и их значения, и мы передаем их во встроенный скрипт powershell. Как мы можем определить $awsacct как строку в упомянутом скрипте?   -  person Sneha    schedule 26.12.2019
comment
Я не понимаю, почему вы не можете использовать Param, но вы также можете рассмотреть возможность сериализации параметров, см.: stackoverflow.com/q/ 34076478/1701026   -  person iRon    schedule 26.12.2019
comment
Приведите предоставленное значение к строке следующим образом: $user = [string]$args[7] или $user = "$($args[7])" или $user = $args[7] -as [string]  -  person JosefZ    schedule 26.12.2019
comment
@JosefZ Следует ли выполнять приведение как [String]$awsacct=$args[4] ИЛИ $awsacct=[String]$args[4] ? Кроме того, $user = $($args[7]) и $user = $args[7] -as [string] не работает.   -  person Sneha    schedule 26.12.2019
comment
@iRon Как упоминалось выше, у нас есть встроенный скрипт в оркестраторе, где мы можем работать со скриптом с точки зрения переменных $args. Это что-то нельзя изменить. Значения аргументов определены, и позже мы присваиваем значения этих аргументов переменным. Пожалуйста, предложите другое.   -  person Sneha    schedule 26.12.2019
comment
Затем расскажите нам больше о том, как вы вызываете этот сценарий (особенно параметры) с помощью оркестратора. Как и сейчас, AccountID обрабатывается как числовое значение, и вам нужно отправить его в виде строки. Другой способ - дополнить значение нулями в коде, например $awsacct = "$args[4]".PadLeft(12,"0") или $awsacct = '{0:000000000000}' -f $args[4].   -  person Theo    schedule 26.12.2019
comment
Мы ничего от вас не слышали. Решил ли какой-либо из данных ответов вашу проблему? Если да, рассмотрите возможность принятия его, нажав ✓ слева. Это поможет другим с похожим вопросом найти его легче.   -  person Theo    schedule 01.01.2020


Ответы (2)


Либо укажите строковое значение, например. '000009876543' ("000009876543") вместо числового значения 000009876543 или привести/преобразовать предоставленное значение в строку, см. следующий фрагмент кода с пояснениями:

if ( $args.Count -lt 1 ) {
    Write-Verbose 'Supply at least one parameter' -Verbose
    exit
}
Remove-Variable val_* -ErrorAction SilentlyContinue
$val_a = $args[0]               # unchanged
$val_b = [string]$args[0]       # dynamically typed variable
[string]$val_c = $args[0]       # strongly typed variable
$val_d = $args[0] -as [string]  # convert the input object, see about_Type_Operators
$val_e = "$($args[0])"          # wrong: removes leading zeroes

Get-Variable val_* | 
    Select-Object -Property Name,
                            Value,
                            @{ L='type'; E={ $_.Value.GetType().Name } },
                            @{ L='test'; E={ $_.Value * 2 } }

Вывод:

PS D:\PShell> D:\PShell\SO\59486037.ps1 '000123'

Name  Value  type   test
----  -----  ----   ----
val_a 000123 String 000123000123
val_b 000123 String 000123000123
val_c 000123 String 000123000123
val_d 000123 String 000123000123
val_e 000123 String 000123000123

PS D:\PShell> D:\PShell\SO\59486037.ps1 000123

Name   Value type           test
----   ----- ----           ----
val_a 000123 Int32           246
val_b 000123 String 000123000123
val_c 000123 String 000123000123
val_d 000123 String 000123000123
val_e    123 String       123123
person JosefZ    schedule 26.12.2019

Как уже отмечалось, если вы не можете отправить аргументы с помощью Orchestrator в виде строки, вы всегда можете манипулировать целочисленным значением внутри кода. В вашем случае значение account_id отправляется сценарию как $args[4], и в процессе оно преобразуется в целое число, удаляя любые начальные нули.

Поскольку в вашей организации вы используете эти идентификаторы как 12-значные числа, вы можете воссоздать их с помощью метода String.PadLeft:

$awsacct = $args[4].ToString().PadLeft(12,"0")

или с помощью оператора формата -f:

$awsacct = '{0:000000000000}' -f $args[4]

или для краткости:

$awsacct = '{0:d12}' -f $args[4]

Использование любого из вышеперечисленных приведет к

      9876543 --> 000009876543
 900000876543 --> 900000876543
person Theo    schedule 27.12.2019
comment
Протестировал то, что упомянуто выше, в местном PS, и это, похоже, не работает. /* Скрипт -- $args = 1,3,4,00987654321 $args[3] $aa = $args[3].PadLeft(12,0) $aa Вывод -- 987654321 1 3 4 987654321[3] */ - person Sneha; 03.01.2020
comment
@Sneha, вам не следует использовать $args в качестве определяемой пользователем переменной, потому что это Автоматическая переменная. Я обновил ответ, чтобы использовать $awsacct = $args[4].ToString().PadLeft(12,"0"). Лично мне больше всего нравится третий пример. - person Theo; 03.01.2020