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
atauForEach-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