क्या PowerShell स्थिरांक का समर्थन करता है?


118

मैं PowerShell में कुछ पूर्णांक स्थिरांक घोषित करना चाहूंगा।

क्या ऐसा करने का कोई अच्छा तरीका है?

जवाबों:


121

उपयोग

Set-Variable test -option Constant -value 100

या

Set-Variable test -option ReadOnly -value 100

"कॉन्स्टेंट" और "रीडऑनली" के बीच का अंतर यह है कि केवल पढ़ने योग्य चर को हटाया जा सकता है (और फिर से बनाया गया)

Remove-Variable test -Force

जबकि एक स्थिर चर नहीं हटाया जा सकता है (यहां तक ​​कि -Force के साथ)।

देखें इस TechNet लेख अधिक जानकारी के लिए।


4
हम्म, लेकिन आप उपयोग करते समय डेटाटाइप को कैसे मजबूर करते हैं Set-Variable? चरों के साथ काम करते समय कोई भी उपयोग कर सकता है [string]$name = valueलेकिन ऐसा लगता है कि स्थिरांक के लिए संभव नहीं है?
मासी

8
@masi सिर्फ मूल्य के लिए मजबूरSet-Variable test -option Constant -value [string]100
Monso

7
@ मानसून जैसे प्रकार निर्दिष्ट करते समय आपको मान के आसपास कोष्ठक की आवश्यकता होती है ([string]100)। नीचे उत्तर देखें।
पॉलीमॉर्फिक्स

15

यहाँ इस तरह एक स्थिरांक को परिभाषित करने के लिए एक समाधान है:

const myConst = 42

Http://poshcode.org/4063 से लिया गया समाधान

    function Set-Constant {
  <#
    .SYNOPSIS
        Creates constants.
    .DESCRIPTION
        This function can help you to create constants so easy as it possible.
        It works as keyword 'const' as such as in C#.
    .EXAMPLE
        PS C:\> Set-Constant a = 10
        PS C:\> $a += 13

        There is a integer constant declaration, so the second line return
        error.
    .EXAMPLE
        PS C:\> const str = "this is a constant string"

        You also can use word 'const' for constant declaration. There is a
        string constant named '$str' in this example.
    .LINK
        Set-Variable
        About_Functions_Advanced_Parameters
  #>
  [CmdletBinding()]
  param(
    [Parameter(Mandatory=$true, Position=0)]
    [string][ValidateNotNullOrEmpty()]$Name,

    [Parameter(Mandatory=$true, Position=1)]
    [char][ValidateSet("=")]$Link,

    [Parameter(Mandatory=$true, Position=2)]
    [object][ValidateNotNullOrEmpty()]$Mean,

    [Parameter(Mandatory=$false)]
    [string]$Surround = "script"
  )

  Set-Variable -n $name -val $mean -opt Constant -s $surround
}

Set-Alias const Set-Constant

1
दुर्भाग्य से यह काम नहीं करता है जब Set-Constantएक मॉड्यूल में निहित है। यह मॉड्यूल के दायरे में एक स्थिरांक पैदा करेगा, जहां Set-Constantनिहित है। वर्कअराउंड के रूप में कोई भी पैरामीटर पारित कर सकता है -Surround Global, लेकिन यह हमेशा नहीं चाहता है। मैं एक समारोह में एक अन्य मॉड्यूल या स्थानीय रूप से एक कंटीन्यू बनाना चाहूंगा।
zett42

11

Cmdlet के -option Constantसाथ प्रयोग करें Set-Variable:

Set-Variable myvar -option Constant -value 100

अब $myvar100 का निरंतर मान है और इसे संशोधित नहीं किया जा सकता है।


1
वाह, यह क्लूनी है। आपको इसे करने के लिए सेट-चर का उपयोग करना होगा, हुह?
टॉम हेज़ल

हां, यह करने का कोई अशुभ तरीका नहीं है :)
पाओलो टेडेस्को

1
आप या तो सेट-वेरिएबल (aliased to sv) या get-variable (gv) का उपयोग करके और इसके विकल्प प्रॉपर्टी के साथ छेड़छाड़ करके भी मौजूदा वेरिएबल को बदल सकते हैं।
x0n

हम्म, लेकिन आप उपयोग करते समय डेटाटाइप को कैसे मजबूर करते हैं Set-Variable? चरों के साथ काम करते समय कोई भी उपयोग कर सकता है [string]$name = valueलेकिन ऐसा लगता है कि स्थिरांक के लिए संभव नहीं है?
मासी

@masi - माइक शेपर्ड का जवाब इस पृष्ठ में कहीं और देखें। कॉपी और वहाँ से चिपकाने, यह है:set-variable -name test -value ([int64]100) -option Constant
क्रिस जे जूल

11

किसी विशिष्ट प्रकार के मान का उपयोग करने के लिए, Int64 कहें, आप सेट-चर में उपयोग किए गए मान को स्पष्ट रूप से डाल सकते हैं।

उदाहरण के लिए:

set-variable -name test -value ([int64]100) -option Constant

जाँच करने के लिए,

$test | gm

और आप देखेंगे कि यह एक Int64 है (Int32 के बजाय, जो मान 100 के लिए सामान्य होगा)।


5

मुझे वास्तव में सिंटैक्टिक शुगर पसंद है जो लूट का जवाब प्रदान करता है:

const myConst = 42

जब आप Set-Constantकिसी मॉड्यूल में फ़ंक्शन को परिभाषित करते हैं तो दुर्भाग्य से उसका समाधान अपेक्षित रूप से काम नहीं करता है । जब मॉड्यूल के बाहर से कॉल किया जाता है, तो यह कॉलर स्कोप केSet-Constant बजाय मॉड्यूल स्कोप में एक स्थिरांक बना देगा, जहां परिभाषित किया गया है । यह लगातार कॉल करने वाले को अदृश्य बनाता है।

निम्न संशोधित फ़ंक्शन इस समस्या को हल करता है। समाधान पर आधारित है इस सवाल का जवाब सवाल का "वहाँ एक powershell मॉड्यूल अपने फोन करने वाले का दायरे में लाने के लिए कोई तरीका है?"

function Set-Constant {
    <#
    .SYNOPSIS
        Creates constants.
    .DESCRIPTION
        This function can help you to create constants so easy as it possible.
        It works as keyword 'const' as such as in C#.
    .EXAMPLE
        PS C:\> Set-Constant a = 10
        PS C:\> $a += 13

        There is a integer constant declaration, so the second line return
        error.
    .EXAMPLE
        PS C:\> const str = "this is a constant string"

        You also can use word 'const' for constant declaration. There is a
        string constant named '$str' in this example.
    .LINK
        Set-Variable
        About_Functions_Advanced_Parameters
    #>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true, Position=0)] [string] [ValidateNotNullOrEmpty()] $Name,
        [Parameter(Mandatory=$true, Position=1)] [char] [ValidateSet("=")] $Link,
        [Parameter(Mandatory=$true, Position=2)] [object] [ValidateNotNullOrEmpty()] $Value
    )

    $var = New-Object System.Management.Automation.PSVariable -ArgumentList @(
        $Name, $Value, [System.Management.Automation.ScopedItemOptions]::Constant
    )

    $PSCmdlet.SessionState.PSVariable.Set( $var )
}

Set-Alias const Set-Constant

टिप्पणियाँ:

  • फ़ंक्शन केवल काम करता है, जब मॉड्यूल के बाहर से बुलाया जाता है , जहां इसे परिभाषित किया जाता है। यह इच्छित उपयोग का मामला है, लेकिन मैं एक चेक जोड़ना चाहूंगा, चाहे इसे उसी मॉड्यूल से बुलाया जाए (जिस स्थिति में Set-Variable -scope 1काम करना चाहिए), जब मुझे पता चले कि ऐसा कैसे करना है।
  • के साथ संगति के लिए मैंने पैरामीटर -Meanका नाम बदल दिया है ।-ValueSet-Variable
  • समारोह वैकल्पिक रूप से सेट करने के लिए बढ़ाया जा सकता है Private, ReadOnlyऔर AllScopeझंडे। बस PSVariableकंस्ट्रक्टर के 3 तर्क में वांछित मान जोड़ें , जिसे उपरोक्त स्क्रिप्ट के माध्यम से कहा जाता है New-Object

-4

PowerShell v5.0 की अनुमति चाहिए

[स्थिर] [int] $ चर = ४२

[स्थिर] [दिनांक समय] $ इस दिन

और जैसे।


2
पीएस 5.1 पर काम नहीं करता है। टाइप [स्थिर] खोजने में असमर्थ।
थॉमसएमएक्स

5
उल्लेख नहीं करने के लिए, स्थैतिक एक स्थिर के रूप में समान नहीं है
कोलोब कैनियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.