Có cách nào để thay thế bất kỳ lời nhắc tương tác nào trong tập lệnh PowerShell không?


13

Khi viết tập lệnh PowerShell, tôi nhận thấy khi một số lệnh ghép ngắn nhất định gặp phải sự cố, chúng sẽ đưa ra lời nhắc tương tác, Loại bỏ mục trên thư mục không trống là một ví dụ. Điều này rất nguy hiểm khi cố gắng tự động hóa các tác vụ, thay vào đó, hành động chỉ là thất bại và ném ngoại lệ hoặc trả lại mã trả về xấu để toàn bộ tập lệnh không bị khóa chờ phản hồi.

Có cách nào để buộc PowerShell tự động thất bại trái ngược với tìm kiếm hành động của người dùng không?


Tôi nghĩ bạn nên đổi tên câu hỏi của mình "Làm thế nào tôi có thể Remove-Itemthất bại nhanh chóng?"
Jay Bazuzi

1
Đây không phải là cụ thể về Remove-Item, nó chỉ là một ví dụ minh họa. Có rất nhiều lệnh ghép ngắn khác sẽ chặn chờ người dùng nhập vào trong các điều kiện phù hợp.
Chuu

Câu trả lời:


5

Giải pháp được đề xuất bởi Eris có hiệu quả bắt đầu một phiên bản PowerShell khác. Một cách khác để làm điều này, với cú pháp đơn giản hơn, là trình bày ra một thể hiện khác của powershell.exe.

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

2
Tôi thực sự thích giải pháp này, nhưng nó mang lại những cơn ác mộng khi viết các thủ tục được lưu trữ đáng tin cậy trong TSQL trước TRY / CATCH, yêu cầu xung quanh mọi truy vấn theo nghĩa đen với bản tóm tắt phát hiện lỗi.
Chuu

4

Xem Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    Xác định xem Windows PowerShell có tự động nhắc bạn về
    xác nhận trước khi chạy lệnh ghép ngắn hoặc hàm.

...

Không có: Windows PowerShell không tự động nhắc.
                         Để yêu cầu xác nhận một lệnh cụ thể, sử dụng
                         tham số Confirm của lệnh ghép ngắn hoặc hàm.

Vì thế:

> $ConfirmPreference = 'None'

Tôi thấy rằng để thấy vấn đề tôi phải đặt ra. $ ConfirmPreference = 'Thấp'
Guy Thomas

Điều này không xuất hiện để làm việc. Xóa-Mục trên thư mục vẫn cung cấp cho bạn lời nhắc sau khi đặt $ ConfirmPreference thành 'Không' hoặc 'Thấp'
Chuu

Hoạt động cho Remove-ADUser(Máy chủ 2012R)
velkoon

2

Ok, điều này thực sự xấu xí, nhưng mù tạt thần thánh làm nó "hoạt động".

Các vấn đề:

  • Tôi chưa tìm ra cách tiếp tục sau lỗi đầu tiên
  • Trong trường hợp này, nó loại bỏ các tập tin đơn giản, sau đó dừng lại ở thư mục đầu tiên
  • Tôi chưa tìm ra cách làm cho lệnh ghép ngắn này hoạt động nếu tôi thêm tham số UseTransaction
  • Điều này sẽ chỉ hoạt động cho trường hợp Đơn giản (các lệnh không thực hiện nhiều thứ với môi trường hiện tại). Tôi chưa thử nghiệm gì phức tạp

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

Đầu ra:

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

Lý do tôi chưa đánh dấu đây là một giải pháp là tôi không có thời gian để kiểm tra nó. Có ai đã triển khai hoặc thử nghiệm mã này ngoài tác giả chưa?
Chuu

0

Tất cả các giải pháp trên đều thất bại đối với tôi khi tôi tạo một thư mục, điều đó có nghĩa là tôi đã được nhắc OK mọi thư mục mà tập lệnh của tôi tạo ra - rất nhiều. Những gì làm việc cho tôi là để ứng dụng | Out-null để chuyển kết quả sang Out-Null

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

Lưu ý rằng $ Directory là một chuỗi có đường dẫn đầy đủ đến thư mục bạn muốn tạo. Hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian: P


-1

Tôi đề nghị hai kỹ thuật

a) Nối -force

b) Bổ sung -errorAction silently continue

Đây là cách tôi nghiên cứu các lệnh ghép ngắn hỗ trợ một tham số cụ thể

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

Một trong những lý do khiến tôi bắt đầu con đường này là tôi thường muốn làm ngược lại với-Force, tức là một cái gì đó giống như -alwaysbackoff. Tôi đã thấy rằng hầu hết các lệnh hỗ trợ lực lượng dường như không có bất kỳ tùy chọn nào để lùi lại.
Chuu

1
Như một bên, viết tắt thuận tiện cho -errorAction SilentlyContinue-ea 0.
Jay Bazuzi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.