창을 표시하지 않고 PowerShell 스크립트를 실행하는 방법은 무엇입니까?


127

사용자에게 창이나 다른 기호를 표시하지 않고 PowerShell 스크립트 를 실행할 수있는 방법은 무엇입니까?

즉, 스크립트는 사용자에게 아무런 신호도 보내지 않고 백그라운드에서 조용히 실행되어야합니다.

타사 구성 요소를 사용하지 않는 답변에 대한 추가 크레딧 :)


학습에 관심이있는 경우이 질문을 확인하십시오. stackoverflow.com/questions/573623/powershell-vs-unix-shells
Thomas Bratt

이 솔루션은 작업 스케줄러에서도 작동합니다. stackoverflow.com/a/51007810/571591
Hilydrow

답변:


128

다음과 같이 실행할 수 있습니다 (하지만 잠시 동안 창이 표시됨).

PowerShell.exe -windowstyle hidden { your script.. }

또는 내가 만든 도우미 파일을 사용하여 정확히 수행하는 PsRun.exe라는 창을 피하십시오. PowerShell에서 WinForm GUI로 소스 및 exe 파일 실행 예약 된 작업을 다운로드 할 수 있습니다 . 예약 된 작업에 사용합니다.

편집 됨 : Marco가 언급했듯이이 -windowstyle 매개 변수는 V2에서만 사용할 수 있습니다.


6
PsRun을 컴파일했지만 예약 된 작업에 추가하면 창도 깜박입니다 ...
Ciantic

2
여기에서도 동일하지만 스크립트를 실행하기 위해 창이 여전히 팝업되기 때문에 작동하지 않습니다. 빠르게 종료되지만 중단없이 백그라운드에서 실행하려고합니다.
Nathan McKaskle

1
그렇기 때문에 응답에 "잠시 동안 창이 표시됩니다"라는 메시지가 표시됩니다.
stej

21
@ThomasBratt 예약 된 작업의 -WindowStyle Hidden경우 Run whether user is logged on or not"보안 옵션"섹션의 일반 탭에서 작업이로 설정되어 있지 않으면 PowerShell 스크립트가 자동으로 실행되는 것을 발견했습니다 .
adam

1
SYSTEM에 사용자 계정을 사용하면 창이 표시되지 않습니다.
존 엘 드리지

27

나는이 같은 문제를 겪고 있었다. powershell.exe 스크립트를 실행하는 작업 스케줄러작업 으로 이동하면 " 사용자의 로그온 여부에 관계없이 실행 "을 클릭 할 수 있으며 작업이 실행될 때 powershell 창을 표시하지 않습니다.


3
타사 확장, 실행 파일 또는 래퍼 스크립트에 의존하지 않는 최상의 솔루션입니다.
반전

1
이 옵션을 사용하려면 사용자에게 "일괄 작업으로 로그온"권한이 있어야합니다.
gb96


18

PowerShell 커뮤니티 확장을 사용 하고 다음을 수행 할 수 있습니다 .

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

VBScript로도이 작업을 수행 할 수 있습니다. http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

( 이 포럼 스레드를 통해 .)


Visual Studio에서 실행할 수 있도록 NuGet 패키지가 있습니까?
Piotr Kula

13

다음은 명령 줄 인수 또는 별도의 실행기가 필요하지 않은 접근 방식입니다. 시작시 창이 잠시 표시되기 때문에 완전히 보이지는 않습니다. 그러나 그것은 빨리 사라집니다. 괜찮은 곳에서는 탐색기에서 두 번 클릭하거나 시작 메뉴 바로 가기 (물론 시작 하위 메뉴 포함)를 통해 스크립트를 시작하려는 경우 가장 쉬운 방법이라고 생각합니다. 그리고 나는 그것이 외부의 것이 아니라 스크립트 자체의 코드의 일부라는 것을 좋아합니다.

이것을 스크립트 앞에 넣으십시오.

$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)

10

다음은 한 줄짜리입니다.

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

이로 인해 창이 매우 짧게 깜박일 수는 있지만 드물게 발생합니다.


대부분의 경우 로그온 한 사용자 컨텍스트에서 Powershell.exe를 실행하면 전체 창이 표시되거나 -windowstyle hidden을 사용하는 경우 잠시 깜박입니다. 창을 완전히 제거하려면 다음 두 가지 중 하나를 수행 할 수 있습니다. 1 : 관리자 계정과 같은 다른 사용자의 컨텍스트에서 실행합니다 (로그온 한 사용자에게 창을 표시하지 않음). 또는 2 : 숨겨진 창 플래그가있는 objshell.run과 함께 vbscript를 사용하여 cmd.exe / c powershel.exe -file c : \ script.ps1을 시작합니다. powershell이 ​​cmd에서 호출되면 wscript.exe // b / nologo c : \ launcher.vbs에 의해 이미 숨겨진 기존 cmd 창에서 실행됩니다.
Iconiu

와, 갑자기. 나는 처음에는 당신의 대답을 눈치 채지 못했습니다. 나는 매우 유사한 대본으로 대답했다. 진정한 대답을하는 지식이있는 사람을 만나는 것이 좋습니다.
Gosha

이것은 받아 들여지는 대답이어야하며 모든 상황에서 작동하는 것처럼 보이는 하나의 방법입니다 (내 문제였던 작업 스케줄러 내부 포함).
Martin Argerami

6

Windows 7에서 C #에서 실행할 때이 문제가 발생했습니다. 숨겨진 powershell 창을 SYSTEM 계정으로 실행할 때 "Interactive Services Detection"서비스가 나타납니다.

"CreateNoWindow"매개 변수를 사용하면 ISD 서비스가 경고를 표시하는 것을 방지했습니다.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};

5

백그라운드 스크립트를 실행할 때 PowerShell의 콘솔 화면을 숨기는 가장 좋은 방법은 이 코드 ( " Bluecakes "답변)입니다.

백그라운드에서 실행해야하는 모든 PowerShell 스크립트의 시작 부분에이 코드를 추가합니다.

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console

이 답변이 도움이 되었다면이 게시물의 답변에서 "Bluecakes"에 투표하십시오 .


나에게 콘솔은 여전히 ​​약 1 초 동안 표시됩니다.
thdoan

3

작업 스케줄러 및 바로 가기에서 숨겨진 ps1

    mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -ExecutionPolicy Bypass & 'C:\PATH\NAME.ps1'"", 0:close")

2

창없이 시작하려는 콘솔 도구에 대한 호출을 원본 파일로 전달하는 작은 도구를 만들었습니다.

https://github.com/Vittel/RunHiddenConsole

컴파일 한 후 실행 파일의 이름을 "<targetExecutableName> w.exe"( "w"추가)로 바꾸고 원본 실행 파일 옆에 두십시오. 그런 다음 일반적인 매개 변수를 사용하여 eG powershellw.exe를 호출하면 창이 팝업되지 않습니다.

누군가 생성 된 프로세스가 입력을 기다리고 있는지 확인하는 방법을 알고 있다면 솔루션을 포함하게되어 기쁩니다. :)


1
사용 PowerShell 스크립트를 실행하려는 경우 가장 좋은 대답 MessageBox없이 모든 사용자가 로그인 한 경우에만 실행 "으로 설정하는 winexe를 아닌 콘솔 응용 프로그램, 그리고 필요로하는 작업 스케줄러로 컴파일 된 EXE를 필요로 (시작시 윈도우의 플래시 on "이므로 현재 데스크톱 세션에 대화 상자가 표시됩니다.)이 기능을 구현해 주셔서 감사합니다. powershellw.exe는 몇 년 동안 제 위시리스트에 올라 왔습니다!
Carl Walsh

추신 : 얼마 전에 "입력 대기"에 대한 솔루션을 포함 시켰습니다 (몇 가지 버그 수정도 포함)!
Chris

@CarlWalsh 나는 콘솔 앱이 아니라 대신 win form 앱을 의미한다고 가정합니다. 창을 포함하지 않습니다. 하지만 프로젝트 유형은 csproj 파일에 정의되어야하며 Visual Studio로 연 후 특정 출력 유형을 설정할 필요가 없습니다
Chris

2

다음은 타사 구성 요소를 포함하지 않는 Windows 10의 작동 솔루션입니다. PowerShell 스크립트를 VBScript로 래핑하여 작동합니다.

1 단계 : VBScript에서 PowerShell을 실행하고 기본적으로 PowerShell을 사용하여 .ps1 파일을 열 수 있도록 일부 Windows 기능을 변경해야합니다.

-실행하고 "regedit"를 입력합니다. 확인을 클릭하고 실행을 허용하십시오.

-이 경로 "HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell"을 붙여넣고 Enter 키를 누릅니다.

-이제 오른쪽 항목을 열고 값을 0으로 변경합니다.

-관리자 권한으로 PowerShell을 열고 "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned"를 입력하고 Enter 키를 누르고 "y"로 변경 사항을 확인한 다음 Enter 키를 누릅니다.

2 단계 : 이제 스크립트 래핑을 시작할 수 있습니다.

-Powershell 스크립트를 .ps1 파일로 저장합니다.

-새 텍스트 문서를 만들고이 스크립트를 붙여 넣습니다.

Dim objShell,objFSO,objFile

Set objShell=CreateObject("WScript.Shell")
Set objFSO=CreateObject("Scripting.FileSystemObject")

'enter the path for your PowerShell Script
 strPath="c:\your script path\script.ps1"

'verify file exists
 If objFSO.FileExists(strPath) Then
   'return short path name
   set objFile=objFSO.GetFile(strPath)
   strCMD="powershell -nologo -command " & Chr(34) & "&{" &_
    objFile.ShortPath & "}" & Chr(34)
   'Uncomment next line for debugging
   'WScript.Echo strCMD

  'use 0 to hide window
   objShell.Run strCMD,0

Else

  'Display error message
   WScript.Echo "Failed to find " & strPath
   WScript.Quit

End If

-이제 파일 경로를 .ps1 스크립트 위치로 변경하고 텍스트 문서를 저장합니다.

-이제 파일을 마우스 오른쪽 버튼으로 클릭하고 이름을 바꿉니다. 그런 다음 파일 이름 확장명을 .vbs로 변경하고 Enter 키를 누른 다음 확인을 클릭합니다.

끝난! 이제 .vbs를 열면 스크립트가 백그라운드에서 실행되는 동안 콘솔 창이 표시되지 않습니다.

이것이 당신에게 효과가 있다면 찬성하십시오!


1

다음은 최소화 및 숨김을 포함하여 콘솔의 다양한 상태를 제어하는 ​​재미있는 데모입니다.

Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
   [DllImport("Kernel32.dll")]
   public static extern IntPtr GetConsoleWindow();
   [DllImport("user32.dll")]
   public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@

$ConsoleMode = @{
 HIDDEN = 0;
 NORMAL = 1;
 MINIMIZED = 2;
 MAXIMIZED = 3;
 SHOW = 5
 RESTORE = 9
 }

$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()

$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.