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

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

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



답변

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

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

답변

참조 Get-Help about_Preference_Variables:

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

...

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

그래서:

> $ConfirmPreference = 'None'

답변

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

이슈 :

  • 첫 번째 오류 후에 계속하는 방법을 알지 못했습니다.
  • 이 경우 일반 파일을 제거한 다음 첫 번째 폴더에서 중지합니다.
  • 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

답변

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

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

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


답변

두 가지 기술을 제안합니다

a) 추가 -force

b) 추가 -errorAction silently continue

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

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