.ps1 파일을 두 번 클릭하여 PowerShell 스크립트를 작동시키는 방법이 있습니까?


139

팀에 PowerShell 스크립트를 배포하고 있습니다. 이 스크립트는 Vsphere 클라이언트에서 IP 주소를 가져오고 mstsc 연결을 만들고 공유 파일에 기록하는 것입니다.

그들이 스크립트를 사용하는 순간 그들은 기계의 IP 주소를 알게되었습니다. 그 후에는 항상 PowerShell 스크립트를 실행하는 대신 mstsc를 직접 사용하는 경향이 있습니다. (mstsc를 사용하고 있으므로 VM을 자주 사용하는지 여부를 알 수 없습니다.)

주로 그들은 PowerShell을 실행하는 것이 간단하지 않다고 말합니다.

나는 그들의 게으름으로 아프다.

.ps1 파일을 두 번 클릭하여 PowerShell 스크립트를 작동시키는 방법이 있습니까?


3
서버에서 로그를 사용하는 것은 어떻습니까? "사용자를 신뢰하지 마십시오"는 데이터로 그를 신뢰할 수 없다는 것을 의미 할 수 있지만, 게으르지 않다고 믿지 않는 경우가 많습니다.


Powershell studio를 사용하여 PS 스크립트 컴파일 sapien.com/software/powershell_studio
Root Loop

vscode를 통해 실행하는 것을 선호합니다 (그래서 콘솔을보고 디버깅 할 수 있습니다)
JinSnow

답변:


132

"Target"과 같은 단축키를 작성하십시오.

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"

3
Jeffery Hicks (Powershell의 권위있는 리소스)는 설정을 변경하지 않는 것이 좋겠다고 조언 했으므로 귀하의 답변이 최선의 답변이며 JPBlanc 답변이 유용한 답변으로 투표하겠습니다.
Samselvaprabu

6
`-noLogo -ExecutionPolicy unrestricted -file <path>`와 함께 사용하십시오 : @ user3071883
Ujjwal Singh

1
@UjjwalSingh : -NoProfile또한 프로필이 스크립트가 기대하지 않는 모든 종류의 작업을 수행 할 수 있기 때문에 유용합니다.
Joey

5
다음 독자를 위해 : 아래 답변에 OP가 요청한 것을 달성하는 레지스트리 해킹이 있습니다. 수락 된 답변은 그렇지 않습니다.
Wouter

2
상대 경로 / 현재 경로를 사용하는 방법이 있습니까?
mythofechelon

79

또는 모든 PS1 파일이 VBS 파일과 같은 방식으로 작동하게하려면 다음과 같이 레지스트리를 편집 할 수 있습니다.

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command

기본값을 다음과 같이 편집하십시오.

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"

그런 다음 원하는대로 모든 .PS1 파일을 두 번 클릭하면됩니다. 나의 겸손한 견해로는 상자에서 나올 수 있습니다.

이것을 "Powershell De-castration Hack"이라고하겠습니다. LOL 즐기세요!


26
이것은이 답변 목록에서 나를 위해 일한 유일한 것입니다. "권장하지 않음"을 대답으로 받아 들일 준비가되어 있지 않습니다. PC에 무엇을해야하는지 말하면 PC가 알려주지 않습니다.
Matt

7
이것은 실제로 이중 우회입니다. 더블 클릭 - 투 - 실행에 대한 제한을 제거, 그리고 심지어는 콘솔에서 신뢰할 수없는 스크립트의 실행 방지하기위한 것입니다 PowerShell에서의 ExecutionPolicy 주위를 가져옵니다.
Iszi

4
이것은 잘못된 방법입니다. "Run with PowerShell"을 기본값으로 설정하는 대신 "Open"명령의 기능을 변경하고 있습니다. 아래 itgala.xyz 답변을 참조하십시오.
Indy411

4
이 방법을 사용하려는 경우 레지스트리 키의 올바른 기본값은 실제로 "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -File "%1"%*선택적으로을 포함 할 수있는 위치 -ExecutionPolicy unrestricted입니다. 명령이 끝날 때 변경 사항을 기록하면 0 개 이상의 매개 변수를 PowerShell 스크립트에 전달할 수 있습니다. 백분율 기호 주위의 따옴표와 간격은 정확하게 표시된 것과 같아야합니다.
Glenn Slayden

2
레지스트리를 편집하는 대신 명령 줄 솔루션의 ftype Microsoft.PowerShellScript.1=^"^%SystemRoot^%\System32\WindowsPowerShell\v1.0\powershell.exe^" -NoLogo -ExecutionPolicy Unrestricted -File ^"%1^" %*경우 동일한 내용을 입력 할 수 있습니다 .
Damian T.

21

PowerShell의 보안 기능 중 하나는 사용자가 더블 클릭으로 스크립트를 시작할 수 없다는 것입니다. 이 설정을 수정하는 경우 각별히주의하십시오. 대안은 스크립트를 패키지하는 것입니다. PrimalScript와 같은 일부 편집자는 그렇게 할 수 있습니다. 사용자는 여전히 PowerShell을 설치해야하지만 exe를 두 번 클릭 할 수 있습니다. 팀에 약간의 교육이 필요한 것 같습니다.


3
그것은 대안을 찾을 때까지 해커 를 적어도 몇 분 지연시키기 때문에 보안 기능입니다 !
MarcH

23
어리 석고 쓸모없는 보안 기능입니다. 당신은 그것에 두 번 ckicling하여 배치를 실행할 수 있습니까? 네, exe? 예. VBScript? 예. poweshell 스크립트가 다른 스크립트보다 더 무질서한 것으로 여겨지는 이유를 모릅니다
Mauro F.

12
잘 모르겠지만 실수로 더블 클릭하기 전에 잘못된 컴퓨터에서 박쥐 파일을 실행했습니다. 관리를 자동화하기 위해 무언가를 제한하는 것이 완벽합니다.
lordcheeto

1
EXE 파일을 두 번 클릭하면 이것이 어떻게 도움이되는지 알 수 없습니다. 그러나 Powershell 팀은이 기본 주장을 알고 있습니다. 그것에 더 있어야합니다.
usr

1
실행하기에 "위험한"스크립트를 작성하고 기본 확인 프로세스를 추가하지 않으면 위험한 삶을 사는 것이 좋습니다.
Romain Vincent

18

이것은 Windows 10 및 powershell 5.1에서 나를 위해 일했습니다.

  • .ps1 파일을 마우스 오른쪽 버튼으로 클릭하십시오
  • 로 열기 ...
  • 다른 앱을 선택하십시오
  • powershell.exe의 위치를 ​​주소 표시 줄에 복사합니다 (기본적으로 Windows 폴더는 표시되지 않음). C : \ Windows \ System32 \ WindowsPowerShell \ v1.0
  • powershell.exe를 선택하십시오
  • "항상이 앱을 사용하여 .ps1 파일 열기"를 선택하십시오.
  • 확인을 클릭하십시오

2
아마도 여러분은 호스트 머신에서 실행 정책을 합리적인 것으로 설정해야합니다. 예 : RemoteSigned
vizmi

4
이것은 몇 살이고 반년 전까지 아무도 이것을 생각하지 않았습니까? -나는 이것도 잘했고 완벽하게 작동하지만 더 많은 구성을 수행해야하지만 powershell은 .ps1 스크립트를 전혀 실행하지 않습니다 (참조 Set-ExecutionPolicy).
DarkWiiPlayer

이 작업을 수행하려면 스크립트 이름에 공백이 없어야합니다. 그 외에는 완벽하게 작동하는 것으로 보입니다.
Luke

2
이것은 어떻게 가장 투표가 잘되지 않습니까? 파일 연결을 통해 Windows가 의도 한 방식으로 레지스트리를 직접 편집하거나 배치 파일을 사용하는 이유는 무엇입니까?
Kickass 박사

Dr.Kickass @ 아마 제 생각 엔 새로운 답변 중 하나입니다
vizmi

17

나는 몇 년 전에 이것을 썼습니다 (관리자 권한으로 실행하십시오).

<#
.SYNOPSIS
    Change the registry key in order that double-clicking on a file with .PS1 extension
    start its execution with PowerShell.
.DESCRIPTION
    This operation bring (partly) .PS1 files to the level of .VBS as far as execution
    through Explorer.exe is concern.
    This operation is not advised by Microsoft.
.NOTES
    File Name   : ModifyExplorer.ps1
    Author      : J.P. Blanc - jean-paul_blanc@silogix-fr.com
    Prerequisite: PowerShell V2 on Vista and later versions.
    Copyright 2010 - Jean Paul Blanc/Silogix
.LINK
    Script posted on:
    http://www.silogix.fr
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault -On
    Call Powershell for .PS1 files.
    Done!
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault
    Tries to go back
    Done!
#>
function Set-PowAsDefault
{
  [CmdletBinding()]
  Param
  (
    [Parameter(mandatory=$false, ValueFromPipeline=$false)]
    [Alias("Active")]
    [switch]
    [bool]$On
  )

  begin
  {
    if ($On.IsPresent)
    {
      Write-Host "Call PowerShell for .PS1 files."
    }
    else
    {
      Write-Host "Try to go back."
    }
  }

  Process
  {
    # Text Menu
    [string]$TexteMenu = "Go inside PowerShell"

    # Text of the program to create
    [string] $TexteCommande = "%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command ""&'%1'"""

    # Key to create
    [String] $clefAModifier = "HKLM:\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open\Command"

    try
    {
      $oldCmdKey = $null
      $oldCmdKey = Get-Item $clefAModifier -ErrorAction SilentlyContinue
      $oldCmdValue = $oldCmdKey.getvalue("")

      if ($oldCmdValue -ne $null)
      {
        if ($On.IsPresent)
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -eq $null)
          {
            New-ItemProperty $clefAModifier -Name "slxOldValue" -Value $oldCmdValue  -PropertyType "String" | Out-Null
            New-ItemProperty $clefAModifier -Name "(default)" -Value $TexteCommande  -PropertyType "ExpandString" | Out-Null
            Write-Host "Done !"
          }
          else
          {
            Write-Host "Already done!"
          }
        }
        else
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -ne $null)
          {
            New-ItemProperty $clefAModifier -Name "(default)" -Value $slxOldValue."slxOldValue"  -PropertyType "String" | Out-Null
            Remove-ItemProperty $clefAModifier -Name "slxOldValue"
            Write-Host "Done!"
          }
          else
          {
            Write-Host "No former value!"
          }
        }
      }
    }
    catch
    {
      $_.exception.message
    }
  }
  end {}
}

2
Computer \ HKEY_CLASSES_ROOT \ Applications \ powershell.exe \ Shell \ Open \ Command와 같이 작동하려면이 위치에서 변경해야했습니다. 이것이 왜 그런지를 설명 할만큼 레지스트리를 이해하지 못합니다. 어쩌면 내가 Powershell 3.0을 실행하고 있기 때문에? 어쨌든, 스크립트 주셔서 감사합니다.
Wouter

15

레지스트리를 조정해야합니다. 먼저 HKEY_CLASSES_ROOT에 대한 PSDrive를 구성하십시오. 기본적으로 설정되어 있지 않기 때문입니다. 이에 대한 명령은 다음과 같습니다.

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

이제 일반 HKCU 및 HKLM PSDrive에서와 마찬가지로 HKEY_CLASSES_ROOT에서 레지스트리 키와 값을 탐색하고 편집 할 수 있습니다.

PowerShell 스크립트를 직접 시작하도록 두 번 클릭을 구성하려면

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0

PowerShell ISE에서 PowerShell 스크립트를 열도록 두 번 클릭을 구성하려면

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'

기본값을 복원하려면 (두 번 클릭하여 메모장에서 PowerShell 스크립트를 열도록 설정) :

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'

Elevated PowerShell ISE의 ​​마지막 줄을 사용하여 기본값을 복원하려고 시도했지만 Thermionix와 같은 명령을 사용하면 Default를 대체하므로 Shell.command를 명시 적으로 재설정해야하지만 분명히 찾지 못했습니다. 올바른 구문을 사용하려면 제어판> 프로그램> 파일 연결을 거쳐야했습니다.
dragon788

13

시스템 설정을 설정하는 것이 약간 많지만 하드 코딩 된 경로가 필요한 바로 가기는 이상적이지 않습니다. 박쥐 파일은 실제로 문제를 잘 해결합니다.

RunMyPowershellScript.bat

 start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"

이 배치 파일을 두 번 클릭하면 배치 파일에 대한 바로 가기를 쉽게 만들 수 있으며 스크립트를 모든 폴더에 배포 할 수 있습니다.


bat 파일과 동일한 폴더에 ps1 스크립트가 필요합니다. 2 개의 파일을 유지 관리하는 대신 복사 붙여 넣기 기능을 사용할 수 있습니다.
jiggunjer

11

레지스트리에서이를 설정하는 간단한 PowerShell 명령.

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
Set-ItemProperty -Path "HKCR:\Microsoft.PowerShellScript.1\Shell\open\command" -name '(Default)' -Value '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"'

5
좀 더 보안 ExecutionPolicy RemoteSigned을 위해 네트워크 / 인터넷에서 다운로드 한 임의의 스크립트 (메타 데이터가 로컬로 생성되지 않았다고 표시)가 두 번 클릭으로 실행되지 않지만 복사 및 코드를 .ps1 파일에 붙여 넣으면 해당 메타 데이터가 없기 때문에 실행됩니다.
dragon788

6
  1. REGEDIT를 HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shell로 이동하십시오.
  2. 오른쪽 창에서 "(기본값)"을 두 번 클릭하십시오.
  3. "Open"(메모장 실행)의 기존 값을 삭제하고 "0"(0이면 Powershell 직접 실행)을 입력하십시오.

메모장을 다시 기본값으로 사용하려면 값을 되 돌리십시오.


5

당신의 기본 파일 연결을 설정할 수 ps1로 파일을 powershell.exe당신이 그것을 더블 클릭하여 파워 쉘 스크립트를 실행 할 수있다.

Windows 10에서는

  1. ps1파일을 마우스 오른쪽 버튼으로 클릭
  2. 딸깍 하는 소리 Open with
  3. 딸깍 하는 소리 Choose another app
  4. 팝업 창에서 More apps
  5. 하단으로 스크롤하여을 선택 Look for another app on this PC합니다.
  6. 를 찾아서 선택 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe합니다.
  7. 목록 항목

파일 연결이 변경되고 파일 ps1을 두 번 클릭하여 실행됩니다. notepad.exe기본 앱 으로 설정 하여 기본 동작으로 다시 변경할 수 있습니다 .

출처


1
이것은 잘 작동하지만 vizmi의 답변과 거의 동일합니다.
Marteng

4

예를 들어, "foobar"라는 스크립트는 "foobar.ps1"및 "foobar.cmd"와 같은 간단한 .cmd 파일을 하위 폴더에 내 .ps1 파일과 동일한 이름으로 넣습니다. 따라서 .ps1을 실행하려면 탐색기에서 .cmd 파일을 클릭하거나 명령 프롬프트에서 .cmd를 실행하면됩니다. .cmd 파일은 자체 이름을 사용하여 .ps1을 자동으로 찾기 때문에 동일한 기본 이름을 사용합니다.

::====================================================================
:: Powershell script launcher
::=====================================================================
:MAIN
    @echo off
    for /f "tokens=*" %%p in ("%~p0") do set SCRIPT_PATH=%%p
    pushd "%SCRIPT_PATH%"

    powershell.exe -sta -c "& {.\%~n0.ps1 %*}"

    popd
    set SCRIPT_PATH=
    pause

pushd / popd를 사용하면 스크립트가있는 특정 디렉토리로 변경하지 않고도 명령 프롬프트에서 .cmd 파일을 시작할 수 있습니다. 스크립트 디렉토리로 변경되고 완료되면 원래 디렉토리로 돌아갑니다.

스크립트가 끝나면 명령 창이 사라지도록하려면 일시 중지를 해제 할 수도 있습니다.

내 .ps1 스크립트에 매개 변수가있는 경우 .NET Forms를 사용하여 GUI 프롬프트로 프롬프트하지만 매개 변수를 전달하려면 스크립트를 유연하게 수락하십시오. 이렇게하면 탐색기에서 두 번 클릭하면 매개 변수에 대한 세부 정보를 알 필요가 없으므로 목록 상자 또는 다른 양식으로 필요한 것을 묻습니다.


2
배치 파일에 감사드립니다. "for"문을 "set SCRIPT_PATH = % ~ p0"(따옴표없이)로 바꿀 수 있습니다. 실제로 ~ p0 대신 ~ dp0을 사용하므로 여러 드라이브에서 작동합니다. 나는 이것을 직접 사용할 것이다.
zumalifeguard

2

이것은 KoZm0kNoT의 답변을 기반으로합니다. 여러 드라이브에서 작동하도록 수정했습니다.

@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd

사용자의 cwd가 다른 드라이브에있는 경우 두 개의 푸시 / 팝이 필요합니다. 외부 세트가 없으면 스크립트가있는 드라이브의 cwd가 손실됩니다.


2

이것이 스크립이 기본적으로 관리자 권한으로 실행되는 데 사용하는 것입니다.

Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList '-File """%1"""'}"

다음에 대한 기본값으로 regedit에 붙여 넣어야합니다.

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command

또는 여기 당신을 위해 그것을 할 스크립트가 있습니다 :

$hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey('ClassesRoot', 'Default')
$key = $hive.CreateSubKey('Microsoft.PowerShellScript.1\Shell\Open\Command')
$key.SetValue($null, 'Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList ''-File """%1"""''}"')

2

고급 Windows 관리에 익숙한 경우이 ADM 패키지 (해당 페이지에 포함 된 지침)를 사용하고이 템플릿과 로컬 GPO를 통해 두 번 클릭 한 후 PowerShell 스크립트를 실행할 수 있습니다. 그런 다음 .ps1 파일 형식과 관련된 기본 프로그램을powershell.exe (검색 사용, 매우 안정적 임) 하면 더블 클릭으로 PowerShell 스크립트를 실행할 수 있습니다.

그렇지 않으면 이러한 관리 도구를 사용하여 전체 시스템을 망칠 수 있으므로 다른 제안 사항을 따르는 것이 좋습니다.

기본 설정이 너무 엄격하다고 생각합니다. 누군가가 컴퓨터에 악성 코드를 넣으면이 제한을 무시할 수 있습니다 (.cmd 파일 또는 .exe로 감싸거나 바로 가기로 속임수). 결국 달성하는 것은 막는 것입니다. 작성한 스크립트를 쉽게 실행할 수 있습니다.


설치되면 "로컬 그룹 정책 편집기"의 로컬 컴퓨터 정책-> 컴퓨터 구성-> 관리 템플릿-> Windows 구성 요소에서이 설정을 찾을 수 있습니다. 여기에서이를 활성화하고 드롭 다운 목록에서 활성화 된 정책을 선택해야합니다.
Wouter December

1

Windows 'SendTo'기능을 사용하여 PS1 스크립트를보다 쉽게 ​​실행할 수 있습니다. 이 방법을 사용하면 PS1 스크립트를 마우스 오른쪽 버튼으로 클릭하고 실행할 수 있습니다. 이것은 OP 질문에 정확하게 대답하지는 않지만 가깝습니다. 바라건대, 이것은 다른 사람들에게 유용합니다. BTW .. 이것은 다양한 다른 작업에 도움이됩니다.

  • Powershell.exe 찾기 / 검색
  • Powershell.exe를 마우스 오른쪽 버튼으로 클릭하고 파일 위치 열기를 선택하십시오.
  • Powershell.exe를 마우스 오른쪽 단추로 클릭하고 바로 가기 만들기를 선택하십시오. 데스크탑과 같은 장소를 임시 저장
  • 기본적으로 관리자 권한으로 열 수 있습니다. 바로 가기> 속성> 고급> 관리자 권한으로 열기를 선택하십시오.
  • Sendto 폴더를 엽니 다. 시작> 실행> 셸 : 보내기
  • Powershell.exe 바로 가기를 Sendto 폴더로 이동
  • 이제 PS1 스크립트를 마우스 오른쪽 버튼으로 클릭 할 수 있습니다.
  • PS1 파일을 마우스 오른쪽 버튼으로 클릭하고 SendTo 컨텍스트 옵션 선택> Powershell 바로 가기 선택
  • PS1 스크립트가 실행되어야합니다.

1
기본 'Powershell로 실행'상황에 맞는 메뉴 옵션보다이 방법이 더 낫습니까?
elBradford

1

나는 이것을 사용했다 (한 번만 실행해야 함). 또한 실행할 권한이 있는지 확인하십시오.

높은 권한을 가진 PowerShell에서 :

Set-ExecutionPolicy=RemoteSigned

박쥐 파일에서 :

-----------------------------------------

 ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit ^&'%%1'

 assoc .ps1=Microsoft.PowerShellScript.1

-----------------------------------------
auto exit: remove -noexit 

그리고 짜잔; * .ps1을 두 번 클릭하면 실행됩니다.


The term '%1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
ajeh

허용 된 답변의 명령을 레지스트리 키에 사용하면 승인 된 답변 과이 답변의 조합 만 나에게 효과적이었습니다. 분명히 실행 assoc이 필요합니다.
ajeh

@ajeh (파티에 대한 bieng leet 죄송합니다.이 오류가 발생하면 작은 따옴표를 잘못 사용했기 때문에 오류가 발생합니다 .UTF-8을 사용하십시오. (padpad ++ 사용; 두 문자열을 삭제하고 runme.cmd 파일로 저장하십시오 )
Paul Fijma

1

Windows 10에서는 파일 확장자 연결에 대한 Windows 탐색기의 재정의를 삭제할 수도 있습니다.

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice

여기에 덧붙여 HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command다른 답변에 언급 된 변경 사항 .

참조 https://stackoverflow.com/a/2697804/1360907를



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.