PowerShell betiğindeki etkileşimli istemleri bastırmanın bir yolu var mı?


13

PowerShell komut dosyaları yazarken, bazı cmdlet'lerin etkileşimli bir istemi getirdikleri sorunlarla karşılaştıklarında, boş olmayan bir dizindeki Kaldır-Öğe'yi örnek olarak gördüm. Bu, görevleri otomatikleştirmeye çalışırken ölümcül olur, daha çok eylemin başarısız olmasını ve bir istisna atmasını veya kötü bir dönüş kodu döndürmesini isterim, böylece tüm komut dosyası bir yanıt beklerken kilitlenmez.

İşlemlerde kullanıcı girdisi aramak yerine PowerShell'i otomatik olarak başarısız olmaya zorlamanın bir yolu var mı?


Bence "Nasıl Remove-Itemhızlı başarısız olabilirim ?" Sorusunu yeniden adlandırmalısınız.
Jay Bazuzi

1
Bu özellikle Kaldır-Öğeyle ilgili değildir, sadece açıklayıcı bir örnektir. Doğru koşullar altında kullanıcı girişini beklemeyi engelleyecek birçok başka cmdlet vardır.
Chuu

Yanıtlar:


5

Eris tarafından önerilen çözüm etkili bir şekilde başka bir PowerShell örneği başlatır. Daha basit sözdizimi ile bunu yapmanın alternatif bir yolu, powershell.exe dosyasının başka bir örneğine kabuk eklemektir.

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"

2
Çözümü gerçekten çok seviyorum, ama tam olarak her bir sorguyu hata algılama kazanı ile çevreleyen gerekli TL / CATCH'den önce TSQL'de güvenilir saklı yordamlar yazmanın kabuslarını geri getiriyor.
Chuu

4

Bakınız Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    Windows PowerShell'in otomatik olarak sizden istenip istenmediğini belirler
    cmdlet veya işlev çalıştırmadan önce onaylama.

...

Hiçbiri: Windows PowerShell otomatik olarak sormaz.
                         Belirli bir komutun onaylanmasını istemek için
                         cmdlet'in veya işlevin Confirm parametresi.

Yani:

> $ConfirmPreference = 'None'

Ben ayarlamak zorunda sorunu görmek için buldum. $ ConfirmPreference = 'Düşük'
Guy Thomas

Bu işe yaramıyor gibi görünüyor. Bir dizin üzerindeki Kaldır-Öğe hala 'Hiçbiri' veya 'Düşük' olarak $ ConfirmPreference ayarladıktan sonra size bir istem verir
Chuu

İçin Works Remove-ADUser(Sunucu 2012R)
velkoon

2

Tamam, bu gerçekten çirkin, ama kutsal hardal "çalışıyor".

Sorunlar:

  • İlk hatadan sonra nasıl devam edeceğimi anlamadım
  • Bu durumda, düz dosyaları kaldırır, ardından ilk klasörde durur
  • UseTransaction parametresini eklersem bu cmdlet'i nasıl çalıştıracağımı anlayamadım
  • Bu yalnızca Basit durum için geçerli olacaktır (geçerli ortamla çok fazla şey yapmayan komutlar). Karmaşık hiçbir şeyi test etmedim

    $MyPS = [Powershell]::Create()
    $MyPS.Commands.AddCommand("Remove-Item")
    $MyPS.Commands.AddParameter("Path", "D:\Temp\t")
    $MyPS.Invoke()

Çıktı:

Commands                                                                                                                 
--------                                                                                                                 
{Remove-Item}                                                                                                            
{Remove-Item}                                                                                                            
Exception calling "Invoke" with "0" argument(s): "A command that prompts the user failed because the host program or the 
command type does not support user interaction. The host was attempting to request confirmation with the following 
message: The item at D:\Temp\t has children and the Recurse parameter was not specified. If you continue, all children 
will be removed with the item. Are you sure you want to continue?"
At line:19 char:1
+ $MyPS.Invoke()
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CmdletInvocationException

Bunu bir çözüm olarak işaretlemememin nedeni, bunu test etmek için zaman bulamadım. Bu kodu yazarın yanı sıra dağıtan veya test eden var mı?
Chuu

0

Bir dizin oluştururken yukarıdaki çözümlerin hepsi benim için başarısız oldu, bu da betiğimin oluşturduğu her bir dizinde Tamam'a yönlendirilmem istendi - ki bu çok fazlaydı. Benim için işe yarayan uygulama oldu | Sonuçları Out-Null'a bağlamak için Out-null

New-Item -ItemType Directory -Path $directory -Force:$true | Out-Null

$ Directory'nin, oluşturmak istediğiniz dizinin tam yolunu içeren bir dize olduğunu unutmayın. Umarım bu biraz zaman kazandırır: P


-1

İki teknik öneririm

a) Ekle -force

b) Ekle -errorAction silently continue

Belirli bir parametreyi hangi cmdlet'leri desteklediğini bu şekilde araştırıyorum

Get-Command | where { $_.parameters.keys -contains "erroraction"}

Bu yolda başlamamın nedenlerinden biri, genellikle -force, yani -alwaysbackoff gibi bir şey yapmak istiyorum. -Force destekleyen komutların çoğunun geri çekilme seçeneğine sahip olmadığını gördüm.
Chuu

1
Bir kenara uygun bir kısaltma olarak için -errorAction SilentlyContinueolan -ea 0.
Jay Bazuzi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.