11.10.2022

Powershell'de yerel betik veya değişkenleri uzak betiklerde kullanmak

Diyelim yerel bilgisayarda bir değişkenimiz var:

PS> $yol = "D:\logs"

Normal şartlar altında yerel bilgisayarda tanımlanan değişkenlerin kapsamları yerel bilgisayardaki betik ortamında kalır. Uzaktaki bilgisayarda çalıştırılan aşağıdaki gibi bir kod hata vermese de beklenen çıktıyı üretmez:

PS> Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $yol }

Yerel değikenin kapsamıını uzaktaki bilgisayarı da içine alacak şekilde genişletmek için şu iki yöntemden birini kullanabiliriz:

PS> Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $Using:yol } 

PS> Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $yol } -ArgumentList $yol

Birden fazla değişken varsa şöyle bir kullanım da mümkün:

PS> Invoke-Command -Computername UZAKPC -Scriptblock { Add-Content -Path $arg[0] -Value $arg[1] } -Argumentlist "D:\test.txt",16

Değişkene ilave olarak yerel bilgisayarda oluşturduğumuz yerelfonksiyon() gibi bir fonksiyon varsa ve bunu uzak bilgisayarda çalıştırmak istiyorsak bu durumda da aşağıdaki gibi yol izleyebiliriz:

PS> Invoke-Command -Computername UZAKPC -ScriptBlock ${Function:yerelfonksiyon}

Yerel fonksiyonları uzak bilgisayarda kullanmanın bir ön koşulu, fonksiyonun Function: sürücüsünde görülebilir olması. Bir modülden falan yüklenecekse Import-Module kullanmak veya bir dosyada ise öncesinde bir kez kullanarak çalışma ortamımıza almak gerek. Alternatif yöntem olarak ArgumentList parametresini de kullanabiliriz. Bu yöntemle karşı tarafa aktarılan foksiyonun "string" veri tipinde aktarıldığı sayfanın altındaki kaynakta belirtilmiş. Bunun çözümü olarak Create() yordamının kullanılması önerilmiş. Yerel bilgisayardaki fonksiyon isminin içinde tire (-) karakteri gibi değişken isimlerinde kullanılmaması gereken karakterler varsa param() kullanarak bu fonksiyonu başka bir değişken ismine dönüştürmek mümkün (uf = uzak fonksiyon kısaltması):

PS> Invoke-Command -Computername UZAKPC -ScriptBlock { param($uf ); [ScriptBlock]::Create($uf).Invoke()} -ArgumentList ${function:yerelfonksiyon}

2023-02-24 ek: Invoke() yerine şu ifade de gayet mantıklı (alias'lar kullanılmıştır):

PS> icm -cn UZAKPC -script {param($uf); iex $uf} -Argumentlist ${function:yerelfonksiyon}

Benzer şekilde bu fonksiyona parametre olarak yine yerel bilgisayarda tanımlanmış değişkenler göndereceksek

PS> Invoke-Command -Computername UZAKPC -ScriptBlock {param($uf,$d1,$d2); [ScriptBlock]::Create($uf).Invoke($d1,$d2)} -ArgumentList ${function:yerelfonksiyon},$deger1,$deger2

---

https://stackoverflow.com/questions/30304366/powershell-passing-function-to-remote-command

Hiç yorum yok: