Set-StrictMode
Menetapkan dan memberlakukan aturan pengodean dalam ekspresi, skrip, dan blok skrip.
Sintaks
Set-StrictMode
-Version <Version>
[<CommonParameters>]
Set-StrictMode
[-Off]
[<CommonParameters>]
Deskripsi
Set-StrictMode
Cmdlet mengonfigurasi mode ketat untuk cakupan saat ini dan semua cakupan anak, dan mengaktifkan dan menonaktifkannya. Saat mode ketat aktif, PowerShell menghasilkan kesalahan penghentian saat konten ekspresi, skrip, atau blok skrip melanggar aturan pengodean praktik terbaik dasar.
Gunakan parameter Versi untuk menentukan aturan pengodean yang akan diberlakukan.
Set-PSDebug -Strict
cmdlet mengaktifkan mode ketat untuk cakupan global. Set-StrictMode
hanya memengaruhi cakupan saat ini dan cakupan anaknya. Kemudian, Anda dapat menggunakannya dalam skrip atau fungsi untuk mengambil alih pengaturan yang diwarisi dari cakupan global.
Saat Set-StrictMode
nonaktif, PowerShell memiliki perilaku berikut:
- Variabel yang tidak diinisialisasi diasumsikan memiliki nilai
0
(nol) atau$Null
, tergantung pada jenis - Referensi ke pengembalian properti yang tidak ada
$Null
- Hasil sintaks fungsi yang tidak tepat bervariasi menurut kondisi kesalahan
- Mencoba mengambil nilai menggunakan indeks yang tidak valid dalam array mengembalikan
$Null
Contoh
Contoh 1: Aktifkan mode ketat sebagai versi 1.0
# Strict mode is off by default.
$a -gt 5
False
Set-StrictMode -Version 1.0
$a -gt 5
The variable $a cannot be retrieved because it has not been set yet.
At line:1 char:3
+ $a <<<< -gt 5
+ CategoryInfo : InvalidOperation: (a:Token) [], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined
Dengan mode ketat diatur ke versi 1.0
, upaya untuk mereferensikan variabel yang tidak diinisialisasi gagal.
Contoh 2: Aktifkan mode ketat sebagai versi 2.0
# Strict mode is off by default.
function add ($a, $b) {
'$a = ' + $a
'$b = ' + $b
'$a+$b = ' + ($a + $b)
}
add 3 4
$a = 3
$b = 4
$a+$b = 7
add(3,4)
$a = 3 4
$b =
$a+$b = 3 4
Set-StrictMode -Version 2.0
add(3,4)
The function or command was called like a method. Parameters should be separated by spaces,
as described in 'Get-Help about_Parameter.'
At line:1 char:4
+ add <<<< (3,4)
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : StrictModeFunctionCallWithParens
Set-StrictMode -Off
$string = "This is a string."
$null -eq $string.Month
True
Set-StrictMode -Version 2.0
$string = "This is a string."
$null -eq $string.Month
Property 'Month' cannot be found on this object; make sure it exists.
At line:1 char:9
+ $string. <<<< month
+ CategoryInfo : InvalidOperation: (.:OperatorToken) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
Perintah ini mengaktifkan mode ketat dan mengaturnya ke versi 2.0
. Akibatnya, PowerShell mengembalikan kesalahan jika Anda menggunakan sintaks metode, yang menggunakan tanda kurung dan koma, untuk panggilan fungsi atau referensi variabel yang tidak diinisialisasi atau properti yang tidak ada.
Output sampel menunjukkan efek mode ketat versi 2.0
.
Tanpa mode ketat versi 2.0
, nilai ditafsirkan (3,4)
sebagai objek array tunggal yang tidak ada yang ditambahkan. Dengan mode ketat versi 2.0
, ini ditafsirkan dengan benar sebagai sintaks yang salah untuk mengirimkan dua nilai.
Tanpa versi 2.0
, referensi ke properti Bulan yang tidak ada dari string hanya $Null
mengembalikan . Dengan versi 2.0
, ini ditafsirkan dengan benar sebagai kesalahan referensi.
Contoh 3: Aktifkan mode ketat sebagai versi 3.0
Dengan mode ketat diatur ke Nonaktif, indeks tidak valid atau di luar batas menghasilkan nilai null.
# Strict mode is off by default.
$a = @(1)
$null -eq $a[2]
$null -eq $a['abc']
True
True
Set-StrictMode -Version 3.0
$a = @(1)
$null -eq $a[2]
$null -eq $a['abc']
Index was outside the bounds of the array.
At line:1 char:1
+ $null -eq $a[2]
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException
+ FullyQualifiedErrorId : System.IndexOutOfRangeException
Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $null -eq $a['abc']
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastFromStringToInteger
Dengan mode ketat yang diatur ke versi atau lebih 3
tinggi, indeks tidak valid atau di luar batas mengakibatkan kesalahan.
Parameter
-Off
Menunjukkan bahwa cmdlet ini mematikan mode ketat untuk cakupan saat ini dan semua cakupan anak.
Jenis: | SwitchParameter |
Position: | Named |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | False |
Terima karakter wildcard: | False |
-Version
Menentukan kondisi yang menyebabkan kesalahan dalam mode ketat. Parameter ini menerima nomor versi PowerShell yang valid. Angka apa pun yang lebih tinggi dari 3
diperlakukan sebagai Latest
. Nilai yang disediakan harus berupa string Latest
atau string yang dapat dikonversi ke jenis System.Version . Versi harus cocok dengan versi rilis PowerShell yang valid.
Nilai efektif untuk parameter ini adalah:
1.0
- Melarang referensi ke variabel yang tidak diinisialisasi, kecuali untuk variabel yang tidak diinisialisasi dalam string.
2.0
- Melarang referensi ke variabel yang tidak diinisialisasi. Ini termasuk variabel yang tidak diinisialisasi dalam string.
- Melarang referensi ke properti objek yang tidak ada.
- Melarang panggilan fungsi yang menggunakan sintaks untuk memanggil metode.
3.0
- Melarang referensi ke variabel yang tidak diinisialisasi. Ini termasuk variabel yang tidak diinisialisasi dalam string.
- Melarang referensi ke properti objek yang tidak ada.
- Melarang panggilan fungsi yang menggunakan sintaks untuk memanggil metode.
- Melarang keluar dari batas atau indeks array yang tidak dapat diselesaikan.
Latest
- Memilih versi terbaru yang tersedia. Versi terbaru adalah yang paling ketat. Gunakan nilai ini untuk memastikan bahwa skrip menggunakan versi paling ketat yang tersedia, bahkan ketika versi baru ditambahkan ke PowerShell.
Perhatian
Menggunakan Latest
untuk Versi dalam skrip tidak deterministik. Arti Latest
dapat berubah dalam rilis baru PowerShell. Skrip yang ditulis untuk versi PowerShell yang lebih lama yang menggunakan Set-StrictMode -Version Latest
tunduk pada aturan yang lebih ketat saat dijalankan di versi PowerShell yang lebih baru.
Jenis: | Version |
Alias: | v |
Position: | Named |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | False |
Terima karakter wildcard: | False |
Input
None
Anda tidak dapat menyalurkan objek ke cmdlet ini.
Output
None
Cmdlet ini tidak mengembalikan output.
Catatan
Meskipun parameter Versi menerima nilai yang lebih besar dari 3.0
, tidak ada aturan tambahan yang ditentukan untuk apa pun yang lebih tinggi dari 3.0
.
Set-StrictMode
hanya efektif dalam cakupan yang ditetapkan dalam dan dalam cakupan anaknya. Untuk informasi selengkapnya tentang cakupan di PowerShell, lihat about_Scopes.