사용자에게 창이나 다른 기호를 표시하지 않고 PowerShell 스크립트 를 실행할 수있는 방법은 무엇입니까?
즉, 스크립트는 사용자에게 아무런 신호도 보내지 않고 백그라운드에서 조용히 실행되어야합니다.
타사 구성 요소를 사용하지 않는 답변에 대한 추가 크레딧 :)
사용자에게 창이나 다른 기호를 표시하지 않고 PowerShell 스크립트 를 실행할 수있는 방법은 무엇입니까?
즉, 스크립트는 사용자에게 아무런 신호도 보내지 않고 백그라운드에서 조용히 실행되어야합니다.
타사 구성 요소를 사용하지 않는 답변에 대한 추가 크레딧 :)
답변:
다음과 같이 실행할 수 있습니다 (하지만 잠시 동안 창이 표시됨).
PowerShell.exe -windowstyle hidden { your script.. }
또는 내가 만든 도우미 파일을 사용하여 정확히 수행하는 PsRun.exe라는 창을 피하십시오. PowerShell에서 WinForm GUI로 소스 및 exe 파일 실행 예약 된 작업을 다운로드 할 수 있습니다 . 예약 된 작업에 사용합니다.
편집 됨 : Marco가 언급했듯이이 -windowstyle 매개 변수는 V2에서만 사용할 수 있습니다.
-WindowStyle Hidden
경우 Run whether user is logged on or not
"보안 옵션"섹션의 일반 탭에서 작업이로 설정되어 있지 않으면 PowerShell 스크립트가 자동으로 실행되는 것을 발견했습니다 .
나는이 같은 문제를 겪고 있었다. powershell.exe 스크립트를 실행하는 작업 스케줄러 의 작업 으로 이동하면 " 사용자의 로그온 여부에 관계없이 실행 "을 클릭 할 수 있으며 작업이 실행될 때 powershell 창을 표시하지 않습니다.
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/
숨겨진 PowerShell 작업 예약 (인터넷 보관)
예약 된 PowerShell (인터넷 아카이브)로 더 재미있게
( 이 포럼 스레드를 통해 .)
다음은 명령 줄 인수 또는 별도의 실행기가 필요하지 않은 접근 방식입니다. 시작시 창이 잠시 표시되기 때문에 완전히 보이지는 않습니다. 그러나 그것은 빨리 사라집니다. 괜찮은 곳에서는 탐색기에서 두 번 클릭하거나 시작 메뉴 바로 가기 (물론 시작 하위 메뉴 포함)를 통해 스크립트를 시작하려는 경우 가장 쉬운 방법이라고 생각합니다. 그리고 나는 그것이 외부의 것이 아니라 스크립트 자체의 코드의 일부라는 것을 좋아합니다.
이것을 스크립트 앞에 넣으십시오.
$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)
다음은 한 줄짜리입니다.
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
이로 인해 창이 매우 짧게 깜박일 수는 있지만 드물게 발생합니다.
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
};
백그라운드 스크립트를 실행할 때 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"에 투표하십시오 .
창없이 시작하려는 콘솔 도구에 대한 호출을 원본 파일로 전달하는 작은 도구를 만들었습니다.
https://github.com/Vittel/RunHiddenConsole
컴파일 한 후 실행 파일의 이름을 "<targetExecutableName> w.exe"( "w"추가)로 바꾸고 원본 실행 파일 옆에 두십시오. 그런 다음 일반적인 매개 변수를 사용하여 eG powershellw.exe를 호출하면 창이 팝업되지 않습니다.
누군가 생성 된 프로세스가 입력을 기다리고 있는지 확인하는 방법을 알고 있다면 솔루션을 포함하게되어 기쁩니다. :)
MessageBox
없이 모든 사용자가 로그인 한 경우에만 실행 "으로 설정하는 winexe를 아닌 콘솔 응용 프로그램, 그리고 필요로하는 작업 스케줄러로 컴파일 된 EXE를 필요로 (시작시 윈도우의 플래시 on "이므로 현재 데스크톱 세션에 대화 상자가 표시됩니다.)이 기능을 구현해 주셔서 감사합니다. powershellw.exe는 몇 년 동안 제 위시리스트에 올라 왔습니다!
다음은 타사 구성 요소를 포함하지 않는 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를 열면 스크립트가 백그라운드에서 실행되는 동안 콘솔 창이 표시되지 않습니다.
이것이 당신에게 효과가 있다면 찬성하십시오!
다음은 최소화 및 숨김을 포함하여 콘솔의 다양한 상태를 제어하는 재미있는 데모입니다.
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"