Bagikan melalui


about_Remote_Variables

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, $ps variabel didefinisikan dalam sesi sementara tempat Get-WinEvent perintah 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 Using cakupan untuk mengidentifikasi variabel lokal dalam perintah jarak jauh.

Sintaksnya Using adalah sebagai berikut:

$Using:<VariableName>

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

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

Pengubah Using cakupan 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 memperluas ke nilai variabel $var dari konteks pemanggil. Anda tidak mendapatkan akses ke objek variabel pemanggil. Pengubah Using cakupan 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

Percikan PowerShell meneruskan kumpulan nama parameter dan nilai ke perintah. Untuk informasi selengkapnya, lihat about_Splatting.

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

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

Situasi lain di mana pengubah cakupan 'Menggunakan' diperlukan

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

  • Perintah yang dijalankan dari jarak jauh, dimulai dengan Invoke-Command menggunakan parameter ComputerName, HostName, SSHConnection atau Sesi (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 atau referensi pemanggil ke dalamnya. Dalam sesi jarak jauh dan di luar proses, mereka selalu merupakan salinan independen. Dalam sesi utas, sesi tersebut diteruskan oleh referensi.

Serialisasi nilai variabel

Perintah yang dijalankan dari jarak jauh dan pekerjaan latar belakang berjalan di luar proses. 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, salinannya 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 Invoke-Command untuk menentukan variabel lokal sebagai nilai parameter.

  • param Gunakan kata kunci untuk menentukan parameter untuk perintah jarak jauh. Nama parameter adalah tempat penampung yang tidak perlu cocok dengan nama variabel lokal.

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

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

Misalnya, perintah berikut menentukan $ps variabel 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