Bagikan melalui


tentang_Variabel_Remote

Deskripsi singkat

Menjelaskan cara menggunakan variabel lokal dan jarak jauh dalam perintah jarak jauh.

Deskripsi panjang

Anda dapat menggunakan variabel dalam perintah yang Anda jalankan di komputer jarak jauh. Tetapkan nilai ke variabel lalu gunakan variabel sebagai pengganti nilai.

Secara default, variabel dalam perintah jarak jauh diasumsikan untuk didefinisikan dalam sesi yang menjalankan perintah. Variabel yang didefinisikan dalam sesi lokal, harus diidentifikasi sebagai variabel lokal dalam perintah .

Menggunakan variabel jarak jauh

PowerShell mengasumsikan bahwa variabel yang digunakan dalam perintah jarak jauh ditentukan dalam sesi tempat perintah berjalan.

Dalam contoh ini, variabel $ps didefinisikan dalam sesi sementara tempat perintah Get-WinEvent berjalan.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

Ketika perintah berjalan dalam sesi persisten, PSSession, variabel jarak jauh harus ditentukan dalam sesi tersebut.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Menggunakan variabel lokal

Anda dapat menggunakan variabel lokal dalam perintah jarak jauh, tetapi variabel harus ditentukan dalam sesi lokal.

Dimulai di PowerShell 3.0, Anda dapat menggunakan pengubah cakupan Using: untuk mengidentifikasi variabel lokal dalam perintah jarak jauh.

Sintaks Using: adalah sebagai berikut:

$Using:<VariableName>

Dalam contoh berikut, variabel $ps dibuat dalam sesi lokal, tetapi digunakan dalam sesi tempat perintah berjalan. Pengubah cakupan Using: mengidentifikasi $ps sebagai variabel lokal.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Pengubah cakupan Using: dapat digunakan dalam PSSession.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

Referensi variabel seperti $Using:var meluas ke nilai variabel $var dari konteks pemanggil. Anda tidak mendapatkan akses ke objek variabel pemanggil. Pengubah cakupan Using: tidak dapat digunakan untuk memodifikasi variabel lokal dalam PSSession. Misalnya, kode berikut tidak berfungsi:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Untuk informasi selengkapnya tentang Using:, lihat about_Scopes

Menggunakan percikan

Penyebaran di PowerShell meneruskan sekumpulan nama dan nilai parameter ke perintah. Untuk informasi selengkapnya, lihat about_Splatting.

Dalam contoh ini, variabel splatting, $Splat adalah tabel hash yang disiapkan di komputer lokal. Invoke-Command terhubung ke sesi komputer jarak jauh. ScriptBlock menggunakan pengubah cakupan Using: dengan simbol At (@) untuk mewakili variabel yang dipecah.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Situasi lain di mana pengubah cakupan Using: diperlukan

Untuk skrip atau perintah apa pun yang dijalankan di luar sesi, Anda memerlukan pengubah cakupan Using: untuk menyematkan nilai variabel dari cakupan sesi asal, sehingga kode di luar sesi dapat mengaksesnya. Pengubah cakupan Using: didukung dalam konteks berikut:

  • Perintah yang dieksekusi dari jarak jauh, dimulai dengan Invoke-Command menggunakan ComputerName, HostName, SSHConnection, atau Session (sesi jarak jauh)
  • Pekerjaan latar belakang, dimulai dengan Start-Job (sesi di luar proses)
  • Pekerjaan utas, dimulai melalui Start-ThreadJob atau ForEach-Object -Parallel (sesi utas terpisah)

Bergantung pada konteksnya, nilai variabel yang disematkan adalah salinan independen dari data dalam cakupan pemanggil atau berupa referensi ke data tersebut. Dalam sesi jarak jauh dan di luar proses, mereka selalu merupakan salinan independen. Dalam sesi utas, data tersebut diteruskan melalui referensi.

Serialisasi nilai variabel

Perintah yang dijalankan dari jarak jauh dan pekerjaan latar belakang berjalan secara terpisah dari proses utama. Sesi di luar proses menggunakan serialisasi dan deserialisasi berbasis XML untuk membuat nilai variabel tersedia di seluruh batas proses. Proses serialisasi mengonversi objek ke PSObject yang berisi properti objek asli tetapi bukan metodenya.

Untuk sekumpulan jenis terbatas, deserialisasi merehidrasi objek kembali ke jenis aslinya. Objek yang direhidrasi adalah salinan instans objek asli. Ini memiliki properti dan metode jenis. Untuk jenis sederhana, seperti System.Version, salinannya tepat. Untuk jenis kompleks, salinan tidak sempurna. Misalnya, objek sertifikat yang direhidrasi tidak menyertakan kunci privat.

Instans dari semua jenis lainnya adalah instans PSObject. Properti pstypenames berisi nama jenis asli yang diawali dengan Deserialized, misalnya, Deserialized.System.Data.DataTable

Menggunakan variabel lokal dengan parameter ArgumentList

Anda dapat menggunakan variabel lokal dalam perintah jarak jauh dengan menentukan parameter untuk perintah jarak jauh dan menggunakan parameter ArgumentList cmdlet untuk menentukan variabel lokal sebagai nilai parameter.

  • Gunakan kata kunci param untuk menentukan parameter untuk perintah jarak jauh. Nama parameter adalah penanda sementara yang tidak perlu sesuai dengan nama variabel lokal.

  • Gunakan parameter yang ditentukan oleh kata kunci param dalam perintah.

  • Gunakan parameter ArgumentList cmdlet untuk menentukan variabel lokal sebagai nilai parameter.

Misalnya, perintah berikut menentukan variabel $ps dalam sesi lokal lalu menggunakannya dalam perintah jarak jauh. Perintah menggunakan $Log sebagai nama parameter dan variabel lokal, $ps, sebagai nilainya.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($Log)
  Get-WinEvent -LogName $Log
} -ArgumentList $ps

Lihat juga