Aracılığıyla paylaş


Invoke-Expression kullanmaktan kaçının

Invoke-Expression Cmdlet yalnızca son çare olarak kullanılmalıdır. Çoğu senaryoda daha güvenli ve daha sağlam alternatifler mevcuttur. Stack Overflow gibi forumlar kötüye kullanım örnekleriyle Invoke-Expression doludur. PsScriptAnalyzer'ın bunun için bir kuralı olduğunu da unutmayın. Daha fazla bilgi için bkz . AvoidUsingInvokeExpression.

Güvenlik etkilerini dikkatle göz önünde bulundurun. Kullanıcı girişi gibi güvenilmeyen bir kaynaktan gelen bir dize doğrudan 'a Invoke-Expressiongeçirildiğinde, rastgele komutlar yürütülebilir. Her zaman önce farklı, daha sağlam ve güvenli bir çözüm düşünün.

Genel senaryolar

Aşağıdaki kullanım senaryolarını göz önünde bulundurun:

  • PowerShell'i bir şeyi doğal bir şekilde yürütmek için yeniden yönlendirmek daha kolaydır. Örneğin:

    Get-Content ./file.ps1 | Invoke-Expression
    

    Bu durumlar önemsiz bir şekilde önlenebilir. Betik veya kod dosya veya AST formunda zaten var, bu nedenle parametrelerle bir betik yazmalı ve dizede kullanmak Invoke-Expression yerine doğrudan çağırmalısınız.

  • Güvenilir bir kaynaktan betik çalıştırma. Örneğin, yükleme betiğini PowerShell deposundan çalıştırma:

    Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression
    

    Bunu yalnızca etkileşimli olarak kullanmanız gerekir. Ve bu, hayatı daha basit hale getirse de, bu uygulama önerilmez.

  • Ayrıştırma hataları için test. PowerShell ekibi, ayrıştırma zamanı hatasını çalışma zamanı hatasına dönüştürmenin tek yolu olduğundan kaynak kodundaki Invoke-Expression ayrıştırma hatalarını sınar.

Sonuç

Diğer çoğu betik dilinin bir dizeyi kod olarak değerlendirmenin bir yolu vardır ve yorumlanmış bir dil olarak PowerShell'in kendisini dinamik olarak çalıştırmanın bir yolu olmalıdır. Ancak üretim ortamında kullanmak Invoke-Expression için iyi bir neden yoktur.

Başvurular