在PowerShell中有一种简单的方法可以在另一个语言环境中格式化数字等吗?我目前正在编写一些函数来简化SVG生成,SVG .用作小数分隔符,而PowerShell de-DE在将浮点数转换为字符串时遵循我的语言环境设置().
是否有一种简单的方法可以为函数设置另一个区域设置,而不会粘连
.ToString((New-Object Globalization.CultureInfo ""))
Run Code Online (Sandbox Code Playgroud)
每个double变量之后?
注意:这是关于用于格式化的语言环境,而不是格式字符串.
(附带问题:在这种情况下我应该使用不变文化en-US吗?或者更确切地说?)
ETA:嗯,我在这里尝试的是以下内容:
function New-SvgWave([int]$HalfWaves, [double]$Amplitude, [switch]$Upwards) {
"<path d='M0,0q0.5,{0} 1,0{1}v1q-0.5,{2} -1,0{3}z'/>" -f (
$(if ($Upwards) {-$Amplitude} else {$Amplitude}),
("t1,0" * ($HalfWaves - 1)),
$(if ($Upwards -xor ($HalfWaves % 2 -eq 0)) {-$Amplitude} else {$Amplitude}),
("t-1,0" * ($HalfWaves - 1))
)
}
Run Code Online (Sandbox Code Playgroud)
对于我倾向于一直写的东西只是一点点自动化,双值需要使用小数点而不是逗号(它们在我的语言环境中使用).
ETA2:有趣的琐事补充:
PS Home:> $d=1.23
PS Home:> $d
1,23
PS Home:> "$d"
1.23
Run Code Online (Sandbox Code Playgroud)
通过将变量放入字符串中,设置的语言环境似乎不适用于某种程度.
我试图执行一些简单的if语句,但所有基于[Microsoft.Management.Infrastructure.CimInstance]的新cmdlet似乎都没有公开.count方法?
$Disks = Get-Disk
$Disks.Count
Run Code Online (Sandbox Code Playgroud)
不归还任何东西.我发现我可以将它转换为[数组],这使得它返回一个.NET .count方法,如预期的那样.
[Array]$Disks = Get-Disk
$Disks.Count
Run Code Online (Sandbox Code Playgroud)
这可以直接将其作为以前cmdlet的数组投射:
(Get-Services).Count
Run Code Online (Sandbox Code Playgroud)
推荐的解决方法是什么?
一个不起作用的例子:
$PageDisk = Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)}
If ($PageDisk.Count -lt 1) {Write-Host "No suitable drives."; Continue}
Else If ($PageDisk.Count -gt 1) {Write-Host "Too many drives found, manually select it."}
Else If ($PageDisk.Count -eq 1) { Do X }
Run Code Online (Sandbox Code Playgroud)
选项A(演员阵容):
[Array]$PageDisk = Get-Disk | Where {($_.IsBoot -eq $False) -and ($_.IsSystem -eq $False)}
If ($PageDisk.Count -lt 1) {Write-Host "No suitable drives."; Continue} …Run Code Online (Sandbox Code Playgroud) 请注意:
C:\> $x = @(1)
C:\> $x = @($x,2)
C:\> $x = @($x,3)
C:\> $x = @($x,4)
C:\> $x = @($x,5)
C:\> $x.Length
2
C:\> @($x |% { $_ }).Length
3
C:\> $x
Length : 2
LongLength : 2
Rank : 1
SyncRoot : {System.Object[] 2, 3}
IsReadOnly : False
IsFixedSize : True
IsSynchronized : False
Count : 2
4
5
C:\>
Run Code Online (Sandbox Code Playgroud)
我预计管道会压平列表。但这并没有发生。我究竟做错了什么?
我正在尝试使用以下方法创建 JSON 数组:
$bodyObject = @(
@{
'Username' = 'email0@email.com'
}
)
$body = $bodyObject | ConvertTo-Json
Run Code Online (Sandbox Code Playgroud)
但该$body对象不包含方括号:
{
"Username": "email0@email.com"
}
Run Code Online (Sandbox Code Playgroud)
如果我向数组添加另一个元素,代码将完美运行:
$bodyObject = @(
@{
'Username' = 'email0@email.com'
},
@{
'Username' = 'email1@email.com'
}
)
$body = $bodyObject | ConvertTo-Json
<# Output:
[
{
"Username": "email0@email.com"
},
{
"Username": "email1@email.com"
}
]
#>
Run Code Online (Sandbox Code Playgroud)
如何获取一个元素数组来生成包含方括号的 JSON?
我想根据变量将单个数组转换为一组较小的数组。所以,0,1,2,3,4,5,6,7,8,9将成为0,1,2,3,4,5,6,7,8,9当大小为3。
我目前的做法:
$ids=@(0,1,2,3,4,5,6,7,8,9)
$size=3
0..[math]::Round($ids.count/$size) | % {
# slice first elements
$x = $ids[0..($size-1)]
# redefine array w/ remaining values
$ids = $ids[$size..$ids.Length]
# return elements (as an array, which isn't happening)
$x
} | % { "IDS: $($_ -Join ",")" }
Run Code Online (Sandbox Code Playgroud)
产生:
IDS: 0
IDS: 1
IDS: 2
IDS: 3
IDS: 4
IDS: 5
IDS: 6
IDS: 7
IDS: 8
IDS: 9
Run Code Online (Sandbox Code Playgroud)
我希望它是:
IDS: 0,1,2
IDS: 3,4,5
IDS: …Run Code Online (Sandbox Code Playgroud) function Main {
$result1 = DoWork1
$result1.GetType()
$result2 = DoWork2
$result2.GetType()
}
function DoWork1 {
$result1 = Invoke-Sqlcmd -Query "select top 1 * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables
#assign to variable then return
return $result1
}
function DoWork2 {
#return results without assigning to variable
return Invoke-Sqlcmd -Query "select top 1 * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables
}
Main
Run Code Online (Sandbox Code Playgroud)
这是意外的输出:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False DataRow System.Object
True True …Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,所以请友善,哈哈。我正试图集中精力思考我刚刚遇到的事情。
第一的
我有一个可以使用以下内容枚举的哈希表:
$ht = [hashtable]@{"Key1"="Value1";"Key2"="Value2"}
$ht.GetEnumerator()
Name Value
---- -----
Key1 Value1
Key2 Value2
Run Code Online (Sandbox Code Playgroud)
如果我将其存储到一个变量中,则它仅在该变量的一次调用中存在。
$KeyPairs = $ht.GetEnumerator()
$KeyPairs
Name Value
---- -----
Key1 Value1
Key2 Value2
$KeyPairs
# Nothing is returned as if $KeyPairs lost its value
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解为什么会这样吗?
第二
通常,对于集合,我有时想要针对单个项目进行测试(例如查看一个实例的属性),我可以使用 Select-Object 或通过索引:
$array = @("Value1","Value2")
$array | select -first 1
Value1
$array[0]
Value1
Run Code Online (Sandbox Code Playgroud)
哈希表枚举器似乎只支持 Select-Option,而不支持索引。
$ht = [hashtable]@{"Key1"="Value1";"Key2"="Value2"}
$ht.GetEnumerator() | Select -first 1
$ht.GetEnumerator() | Select -first 1
Name Value
---- -----
Key1 Value1
($ht.GetEnumerator() | measure).count
2 …Run Code Online (Sandbox Code Playgroud) 此问题最流行的答案涉及以下 Windows powershell 代码(已编辑以修复错误):
$file1 = Get-Content C:\temp\file1.txt
$file2 = Get-Content C:\temp\file2.txt
$Diff = Compare-Object $File1 $File2
$LeftSide = ($Diff | Where-Object {$_.SideIndicator -eq '<='}).InputObject
$LeftSide | Set-Content C:\temp\file3.txt
Run Code Online (Sandbox Code Playgroud)
我总是得到一个零字节文件作为输出,即使我删除了 $Diff 行。
为什么输出文件总是为空,如何修复?
powershell ×8
arrays ×4
cim ×1
cmdlets ×1
compare ×1
enumeration ×1
enumerator ×1
file ×1
hashtable ×1
json ×1
locale ×1
scalar ×1
windows ×1