Apakah ada cara untuk menekan setiap prompt interaktif dalam skrip PowerShell?

13

Saat menulis skrip PowerShell, saya perhatikan ketika cmdlet tertentu menghadapi masalah mereka memunculkan prompt interaktif, Hapus-Item pada direktori non-kosong menjadi contoh. Ini mematikan ketika mencoba untuk mengotomatiskan tugas, saya lebih suka tindakannya gagal dan melemparkan pengecualian atau mengembalikan kode pengembalian yang buruk sehingga seluruh skrip tidak terkunci menunggu jawaban.

Apakah ada cara untuk memaksa PowerShell gagal secara otomatis dan bukannya mencari input pengguna pada tindakan?

Chuu
sumber
Saya pikir Anda harus mengganti nama pertanyaan Anda, "Bagaimana saya bisa membuat Remove-Itemkegagalan dengan cepat?"
Jay Bazuzi
1
Ini bukan secara khusus tentang Remove-Item, itu hanya contoh ilustratif. Ada banyak cmdlet lain yang akan memblokir menunggu input pengguna dalam kondisi yang tepat.
Chuu

Jawaban:

5

Solusi yang diusulkan oleh Eris secara efektif memulai contoh PowerShell lainnya. Cara alternatif untuk melakukan ini, dengan sintaksis yang lebih sederhana, adalah dengan keluar ke instance lain dari powershell.exe.

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"
Damian Powell
sumber
2
Saya sangat suka solusinya, tetapi itu membawa kembali mimpi buruk menulis prosedur tersimpan yang dapat diandalkan di TSQL sebelum TRY / CATCH yang diperlukan mengelilingi setiap permintaan dengan boilerplate deteksi kesalahan.
Chuu
4

Lihat Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    Menentukan apakah Windows PowerShell secara otomatis meminta Anda
    konfirmasi sebelum menjalankan cmdlet atau fungsi.

...

Tidak ada: Windows PowerShell tidak meminta secara otomatis.
                         Untuk meminta konfirmasi atas perintah tertentu, gunakan
                         Konfirmasikan parameter cmdlet atau fungsi.

Begitu:

> $ConfirmPreference = 'None'
Jay Bazuzi
sumber
Saya menemukan bahwa untuk melihat masalah saya harus mengatur. $ ConfirmPreference = 'Rendah'
Guy Thomas
Tampaknya ini tidak berfungsi. Remove-Item pada direktori masih memberi Anda prompt setelah menetapkan $ ConfirmPreference ke 'None' atau 'Low'
Chuu
Bekerja untuk Remove-ADUser(Server 2012R)
velkoon
2

Ok, ini benar-benar jelek, tetapi mustard kudus menodainya "bekerja".

Masalah:

  • Saya belum menemukan cara untuk melanjutkan setelah kesalahan pertama
  • Dalam hal ini, ia menghapus file biasa, lalu berhenti di folder pertama
  • Saya belum menemukan cara untuk membuat cmdlet ini berfungsi jika saya menambahkan parameter UseTransaction
  • Ini hanya akan berfungsi untuk kasus Sederhana (perintah yang tidak melakukan banyak hal dengan lingkungan saat ini). Saya belum menguji sesuatu yang kompleks

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

Keluaran:

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
Eris
sumber
Alasan saya belum menandai ini sebagai solusi adalah saya belum menemukan waktu untuk mengujinya. Adakah yang menggunakan atau menguji kode ini selain dari penulis?
Chuu
0

Semua solusi di atas gagal untuk saya ketika saya membuat direktori, yang berarti bahwa saya diminta untuk OK setiap direktori tunggal yang dibuat skrip saya - yang banyak. Apa yang berhasil bagi saya adalah apped | Out-null untuk menyalurkan hasilnya ke Out-Null

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

Perhatikan bahwa $ Directory adalah string dengan path lengkap ke direktori yang ingin Anda buat. Semoga ini menghemat waktu seseorang: P

Chris Sprague
sumber
-1

Saya menyarankan dua teknik

a) Tambahkan -force

b) Tambahkan -errorAction silently continue

Ini adalah bagaimana saya meneliti cmdlet mana yang mendukung parameter tertentu

Get-Command | where { $_.parameters.keys -contains "erroraction"}
Guy Thomas
sumber
Salah satu alasan saya memulai jalan ini adalah karena saya biasanya ingin melakukan kebalikan dari-force, yaitu sesuatu seperti -alwaysbackoff. Saya telah menemukan bahwa sebagian besar perintah yang mendukung-memaksa tampaknya tidak memiliki opsi untuk mundur.
Chuu
1
Sebagai tambahan, singkatan yang mudah untuk -errorAction SilentlyContinueadalah -ea 0.
Jay Bazuzi