簡體   English   中英

PowerShell:輸入參數[Array]元素自動/不正確地轉換為錯誤的數據類型

[英]PowerShell: Input Parameter [Array] element automatically/incorrectly converts to wrong datatype

PowerShell會自動假定值“ 9e9(在下面的COMMAND中)是一個整數; 因為該值沒有用引號引起來。

我正在尋找一種任何巧妙的方式來將所有數組元素/值都視為字符串(無論如何),或者強制PowerShell將中間帶有'e'字符的任何值都視為字符串...或其他任何值在將其自動強制轉換為整數而不必用引號將值引起來之前的一種可能方法。

命令:

Get-Input -var 9e9, ba7


碼:

function Get-Input {

    [CmdletBinding()]
    param(
        [array[]]$Vars
    )

    $Var = $Vars[0]

    write-output $Var
}

****更新****

TessellatingHeckler在回答的最后提供了最佳解決方案。 我只做了一個小小的修改就刪除了空格。 我仍然認為這都是PowerShell的錯。 J / K。 我非常感謝TessellatingHeckler分解所有內容並仍然提供明智的解決方案的時間。 感謝TessellatingHeckler!

命令:

Get-Input -vars "9e9, ba7"


新代碼:

function Get-Input {

    [CmdletBinding()]
    param(
        [string[]]$Vars
    )

    $Vars = $Vars.replace(' ', "")
    $Vars = $Vars.split(",")

    $Var = $Vars[0]

    write-output $Var

}

PowerShell會自動假定值“ 9e9”(在下面的COMMAND中)是整數; 因為該值沒有用引號引起來。

誠然,這讓我有點討厭“責備我喜歡的工具”的措辭。 '假定':“足夠傲慢或無禮以致無法做某事”

語言規范 (第2.3.5.12節實數文字)中,“數字e數字”是一種寫實數([double])的方法。

並不是說PowerShell會假設任何東西,而是通過使用“這是一個數字”語法而不是“這是一個字符串”語法(引號) 告訴它以這種方式解釋它。

無論如何。

我正在尋找任何巧妙的方法來將所有數組元素/值都視為字符串(無論如何)[..]

在將其自動強制轉換為整數之前,不必將值用引號引起來。

數組值為9000000000,如果您可以將其強制為字符串,則字符串將為"9000000000" -即在那時,將其改回已為時已晚。

1/2表示0.5方式相同,您不能將0.5轉換為字符串並期望得到1/2的結果。

它沒有被強制轉換為一個數字,它在PowerShell的語言的數字。

聽起來有點像我要重復同一點,但是這次的意義是您在函數中所做的任何事情,例如將參數類型設置為[string[]]都為時已晚,以至於無法改變,數組已經有不希望的解釋。 任何干預都必須盡早進行。

強制PowerShell將中間帶有'e'字符的任何值視為字符串...或任何其他可能方式

在掃描Get-Input -var 9e9, ba7它將讀取“ Get-Input”的GenericToken,這將變成命令。

它命中“-”並開始讀取運算符或參數,讀取“ var”直到空格且與運算符不匹配(“ -eq”,“-gt”等),因此將其視為參數。

它讀取“ 9”並開始讀取數字。

只有兩種方法可以解決此問題-如果數字有效,則將其讀取為數字。 現在就發生了,您不想要它。

如果該數字無效,例如7z.exe以一個數字開頭,但不是一個數字,則它將失敗, 7z.exe ,並將其作為自變量的GenericToken對待。

因此,您可以添加其他內容以將其強制為字符串9e9z 但是您不能編寫'9e9'並將其變成沒有引號的字符串。

關於唯一可以做的是使用其他東西作為分隔符(而不是逗號),這將迫使整個參數成為一個字符串-這也意味着沒有空格-然后自己將其拆分為函數內的文本。

function Get-Input {

    [CmdletBinding()]
    param(
        [string]$VarsText
    )

    $Vars = $VarsText.Split('.')

    $Var = $Vars[0]
    write-output $Var
}

Get-Input 9e9.bab

這只會使所有人感到困惑,並且如果您這樣做的話,可能會更有幫助地閱讀

Get-Input "9e9,bab,..." 

並在每個引號中使用了大家都熟悉的逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM