PowerShell 스크립트에서 대화 형 프롬프트를 표시하지 않는 방법이 있습니까?


13

PowerShell 스크립트를 작성할 때 특정 cmdlet에서 문제가 발생하면 비어 있지 않은 디렉터리에 대화 형 프롬프트 인 Remove-Item이 표시됩니다. 이것은 작업을 자동화하려고 할 때 치명적입니다. 작업이 실패하고 예외를 던지거나 나쁜 반환 코드를 반환하여 전체 스크립트가 응답을 기다리는 동안 잠기지 않습니다.

조치에 대한 사용자 입력을 찾는 대신 PowerShell이 ​​자동으로 실패하도록하는 방법이 있습니까?


" Remove-Item빠르게 실패하려면 어떻게해야 합니까?"라는 질문의 이름을 바꿔야한다고 생각합니다.
Jay Bazuzi

1
이것은 Remove-Item에 대한 것이 아니라 단지 예시 일뿐입니다. 올바른 조건에서 사용자 입력을 기다리는 것을 차단하는 다른 cmdlet이 많이 있습니다.
Chuu

답변:


5

Eris가 제안한 솔루션은 다른 PowerShell 인스턴스를 효과적으로 시작합니다. 더 간단한 구문으로이 작업을 수행하는 다른 방법은 다른 powershell.exe 인스턴스에 셸 아웃하는 것입니다.

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

2
나는 솔루션을 정말로 좋아하지만 TRY / CATCH 이전에 TSQL에서 신뢰할 수있는 저장 프로 시저를 작성하는 악몽을 가져옵니다.
Chuu

4

참조 Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    Windows PowerShell에서 자동으로 메시지를 표시할지 여부를 결정합니다.
    cmdlet 또는 함수를 실행하기 전에 확인하십시오.

...

없음 : Windows PowerShell이 ​​자동으로 프롬프트되지 않습니다.
                         특정 명령의 확인을 요청하려면
                         cmdlet 또는 함수의 Confirm 매개 변수

그래서:

> $ConfirmPreference = 'None'

나는 내가 설정해야 할 문제를 보았습니다. $ ConfirmPreference = '낮은'
가이 토마스

작동하지 않는 것 같습니다. 디렉토리에있는 Remove-Item은 $ ConfirmPreference를 'None'또는 'Low'로 설정 한 후에도 여전히 프롬프트를 표시합니다.
Chuu

대한 작품 Remove-ADUser(서버 2012R)
velkoon

2

좋아, 이것은 정말로 추악하지만 거룩한 겨자는 그것을 "작동한다".

이슈 :

  • 첫 번째 오류 후에 계속하는 방법을 알지 못했습니다.
  • 이 경우 일반 파일을 제거한 다음 첫 번째 폴더에서 중지합니다.
  • UseTransaction 매개 변수를 추가하면이 cmdlet을 작동시키는 방법을 알지 못했습니다.
  • 이것은 간단한 경우 (현재 환경에서 많은 일을하지 않는 명령)에서만 작동합니다. 복잡한 것을 테스트하지 않았습니다

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

산출:

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

내가 이것을 해결책으로 표시하지 않은 이유는 그것을 테스트 할 시간을 찾지 못했기 때문입니다. 작성자 외에이 코드를 배포하거나 테스트 한 사람이 있습니까?
Chuu

0

디렉토리를 만들 때 위의 모든 솔루션이 실패했습니다. 즉, 스크립트가 만든 모든 단일 디렉토리를 확인하라는 메시지가 표시되었습니다. 나를 위해 일한 것은 apped이었다 | 결과를 Out-Null로 파이프하기 위해 Out-Null

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

$ Directory는 만들려는 디렉토리의 전체 경로가있는 문자열입니다. 희망이 있으면 누군가 시간을 절약 할 수 있습니다. : P


-1

두 가지 기술을 제안합니다

a) 추가 -force

b) 추가 -errorAction silently continue

이것이 특정 매개 변수를 지원하는 cmdlet을 조사하는 방법입니다.

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

내가이 길을 시작한 이유 중 하나는 보통 -force의 반대, 즉 -alwaysbackoff와 같은 것을하고 싶기 때문입니다. -force를 지원하는 대부분의 명령에는 백 오프 할 수있는 옵션이없는 것으로 나타났습니다.
Chuu

1
옆으로 편리한 약어는 -errorAction SilentlyContinue입니다 -ea 0.
Jay Bazuzi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.