มีวิธีทำให้สคริปต์ PowerShell ทำงานโดยดับเบิลคลิกที่ไฟล์. ps1 หรือไม่


150

ฉันกำลังแจกจ่ายสคริปต์ PowerShell ให้กับทีมของฉัน สคริปต์คือการดึงที่อยู่ IP จากไคลเอ็นต์ Vsphere ทำการเชื่อมต่อ mstsc และบันทึกในไฟล์ที่แชร์

ช่วงเวลาที่พวกเขาใช้สคริปต์พวกเขาได้รู้จักที่อยู่ IP ของเครื่อง หลังจากนั้นพวกเขามักจะใช้ mstsc โดยตรงแทนที่จะเรียกใช้สคริปต์ PowerShell (เนื่องจากพวกเขาใช้ mstsc ฉันไม่สามารถรู้ได้ว่าพวกเขาใช้ VM บ่อยหรือไม่)

ส่วนใหญ่พวกเขากำลังบอกฉันว่าการใช้ PowerShell นั้นไม่ตรงไปตรงมา

ฉันป่วยด้วยความขี้เกียจของพวกเขา

มีวิธีทำให้สคริปต์ PowerShell ทำงานโดยดับเบิลคลิกที่ไฟล์. ps1 หรือไม่


3
วิธีการใช้บันทึกบนเซิร์ฟเวอร์? "อย่าไว้ใจผู้ใช้" อาจหมายความว่าคุณไม่สามารถไว้วางใจเขากับข้อมูลของคุณได้ แต่บ่อยกว่านั้นหมายความว่าอย่าไว้ใจเขาที่จะไม่ขี้เกียจ


การรวบรวมสคริปต์ PS โดยใช้ Powershell studio sapien.com/software/powershell_studio
Root Loop

ฉันชอบที่จะเรียกใช้ผ่าน vscode (ดังนั้นฉันจึงสามารถเห็นคำปลอบใจและแก้ไขข้อบกพร่องได้)
JinSnow

1
ฉันเองก็ป่วยด้วยความขี้เกียจของผู้ใช้อีกอย่างหนึ่ง ..
ทิโม

คำตอบ:


134

สร้างทางลัดโดยใช้สิ่งนี้เป็น "เป้าหมาย":

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

6
สำหรับผู้อ่านในอนาคต: มีการแฮ็กรีจิสทรีในคำตอบด้านล่างซึ่งทำให้สำเร็จตามที่ OP ขอ คำตอบที่ยอมรับไม่ได้
Wouter

2
มีวิธีดำเนินการ แต่ใช้ญาติ / เส้นทางปัจจุบันหรือไม่?
Mythofechelon

80

หรือถ้าคุณต้องการให้ไฟล์ 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 ทั้งหมดของคุณตามที่คุณต้องการ ในความเห็นที่ต่ำต้อยของฉันจงออกนอกกรอบ

ฉันจะเรียกสิ่งนี้ว่า "The Powershell De-castration Hack" LOL สนุก!


30
นี่เป็นคำตอบเดียวที่เหมาะกับฉันในรายการคำตอบนี้ ฉันไม่ได้เตรียมที่จะยอมรับคำตอบว่า "ไม่แนะนำ" - ฉันบอกพีซีว่าต้องทำอย่างไรพีซีไม่ได้บอกฉัน
Matt

7
นี่คือการบายพาสสองครั้ง ลบข้อ จำกัด จากการดับเบิลคลิกเพื่อรันและหลีกเลี่ยง ExecutionPolicy ของ PowerShell ซึ่งมีไว้เพื่อป้องกันการเรียกใช้สคริปต์ที่ไม่น่าเชื่อถือแม้กระทั่งจากคอนโซล
Iszi

4
นี่เป็นวิธีที่ผิดที่จะทำ คุณกำลังเปลี่ยนสิ่งที่คำสั่ง "เปิด" ทำแทนที่จะตั้งค่า "Run with PowerShell" เป็นค่าเริ่มต้น ดูคำตอบ itgala.xyz ด้านล่าง
Indy411

4
หากคุณต้องการใช้วิธีนี้ค่าเริ่มต้นที่ถูกต้องสำหรับคีย์รีจิสทรีคือ"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -File "%1"%*ที่ที่คุณสามารถเลือกรวมไฟล์-ExecutionPolicy unrestricted. สังเกตการเปลี่ยนแปลงที่ส่วนท้ายของคำสั่งซึ่งอนุญาตให้ส่งผ่านพารามิเตอร์เป็นศูนย์หรือมากกว่าไปยังสคริปต์ PowerShell เครื่องหมายคำพูดและระยะห่างรอบ ๆ เครื่องหมายเปอร์เซ็นต์ควรตรงตามที่แสดง
Glenn Slayden

3
สำหรับโซลูชันบรรทัดคำสั่งแทนที่จะแก้ไขรีจิสทรีคุณสามารถพิมพ์ftype Microsoft.PowerShellScript.1=^"^%SystemRoot^%\System32\WindowsPowerShell\v1.0\powershell.exe^" -NoLogo -ExecutionPolicy Unrestricted -File ^"%1^" %*สิ่งที่จะทำเช่นเดียวกัน
Damian T.

20

สิ่งนี้ใช้ได้กับฉันใน 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

3
นี่ไม่ใช่คำตอบที่ได้รับการโหวตสูงสุดได้อย่างไร เหตุใดเราจึงแก้ไขรีจิสทรีโดยตรงหรือใช้ไฟล์แบตช์ในเมื่อคุณสามารถทำได้ตามที่ Windows ต้องการผ่านการเชื่อมโยงไฟล์
ดร. Kickass

@ Dr.Kickass อาจเป็นหนึ่งในคำตอบที่ใหม่กว่าที่ฉันเดา
vizmi

19

โปรดทราบว่าคุณลักษณะด้านความปลอดภัยอย่างหนึ่งของ PowerShell คือผู้ใช้ไม่สามารถเรียกใช้สคริปต์ได้ด้วยการคลิกสองครั้ง ใช้ความระมัดระวังเป็นอย่างยิ่งหากคุณแก้ไขการตั้งค่านี้ อีกทางเลือกหนึ่งคือการจัดแพ็กเกจสคริปต์ของคุณ บรรณาธิการบางคนเช่น PrimalScript สามารถทำได้ ผู้ใช้ยังคงต้องติดตั้ง PowerShell แต่จากนั้นก็สามารถดับเบิลคลิกที่ exe ได้ และดูเหมือนว่าทีมของคุณต้องการการศึกษาเล็กน้อย


3
เป็นคุณสมบัติด้านความปลอดภัยเพราะจะทำให้แฮกเกอร์ล่าช้าไปอย่างน้อยสองสามนาทีจนกว่าพวกเขาจะพบทางเลือกอื่น!
MarcH

32
มันเป็นคุณลักษณะด้านความปลอดภัยที่โง่และไร้ประโยชน์ คุณสามารถรันแบทช์โดยใช้ ckicling สองครั้ง ใช่ exe? ใช่. VBScript? ใช่. ฉันไม่ทราบว่าเหตุใดสคริปต์ Poweshell จึงได้รับการพิจารณาว่าเป็นอันตรายมากกว่าสคริปต์อื่น ๆ ทั้งหมด
Mauro F.

12
ฉันไม่รู้เกี่ยวกับพวกคุณ แต่ฉันเคยใช้ไฟล์ bat บนคอมพิวเตอร์ที่ไม่ถูกต้องมาก่อนด้วยการดับเบิลคลิกโดยไม่ได้ตั้งใจ ด้วยบางสิ่งบางอย่างที่มีไว้เพื่อทำให้การดูแลระบบเป็นไปโดยอัตโนมัติจึงเหมาะสมอย่างยิ่งที่จะ จำกัด สิ่งนั้น
lordcheeto

1
คุณสามารถดับเบิลคลิกที่ไฟล์ EXE ได้ดังนั้นฉันไม่เห็นว่าสิ่งนี้ช่วยได้อย่างไร แต่แน่นอนว่าทีม Powershell ตระหนักถึงข้อโต้แย้งพื้นฐานนี้ ต้องมีอะไรมากกว่านั้น
usr

2
หากคุณเขียนสคริปต์ที่ "อันตราย" ในการดำเนินการและคุณไม่ได้เพิ่มกระบวนการยืนยันพื้นฐาน ... ฉันคิดว่าคุณชอบที่จะอยู่อย่างอันตราย
Romain Vincent

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

คุณจะต้องปรับแต่งรีจิสทรี ขั้นแรกกำหนดค่า PSDrive สำหรับ HKEY_CLASSES_ROOT เนื่องจากไม่ได้ตั้งค่าตามค่าเริ่มต้น คำสั่งสำหรับสิ่งนี้คือ:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

ตอนนี้คุณสามารถนำทางและแก้ไขรีจิสตรีคีย์และค่าใน HKEY_CLASSES_ROOT ได้เช่นเดียวกับที่คุณทำใน HKCU และ HKLM PSDrives ปกติ

ในการกำหนดค่าการดับเบิลคลิกเพื่อเปิดสคริปต์ PowerShell โดยตรง:

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

ในการกำหนดค่าการดับเบิลคลิกเพื่อเปิดสคริปต์ PowerShell ใน PowerShell ISE:

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

ในการคืนค่าเริ่มต้น (ตั้งค่าการดับเบิลคลิกเพื่อเปิดสคริปต์ PowerShell ใน Notepad):

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

ฉันพยายามกู้คืนค่าเริ่มต้นโดยใช้บรรทัดสุดท้ายจาก Elevated PowerShell ISE แต่เห็นได้ชัดว่าหากคุณใช้คำสั่งอย่างที่ Thermionix อธิบายว่าจะแทนที่ค่าเริ่มต้นดังนั้นคุณต้องรีเซ็ต Shell.command อย่างชัดเจน (แต่ฉันไม่พบ ไวยากรณ์ที่ถูกต้องสำหรับสิ่งนั้นดังนั้นฉันต้องไปที่แผงควบคุม> โปรแกรม> สมาคมไฟล์)
dragon788

13

ฉันยอมรับว่าการตั้งค่าระบบอาจจะมากไปหน่อย แต่ทางลัดที่ต้องใช้พา ธ แบบฮาร์ดโค้ดนั้นไม่เหมาะ ไฟล์ bat ช่วยแก้ปัญหาได้ดี

RunMyPowershellScript.bat

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

ไฟล์แบตช์นี้สามารถดับเบิลคลิกได้แล้วทางลัดสามารถสร้างไปยังไฟล์แบตช์ได้อย่างง่ายดายและสคริปต์สามารถปรับใช้กับโฟลเดอร์ใดก็ได้


โปรดทราบว่าคุณต้องใช้สคริปต์ ps1 ในโฟลเดอร์เดียวกับไฟล์ bat คุณได้รับความสามารถในการคัดลอกวางโดยมีค่าใช้จ่ายในการดูแลรักษา 2 ไฟล์
jiggunjer

@rick ไม่ได้ผลสำหรับฉันไม่มีอะไรเกิดขึ้นนอกจากหน้าต่างสีดำที่โผล่ขึ้นมาในช่วงมิลลิวินาที:start powershell -command "& 'C:\Users\skripte\arbeitstage.ps1'"
Timo

@Timo ลองเรียกใช้คำสั่งของคุณในหน้าต่างพรอมต์คำสั่งปกติเพื่อให้คุณสามารถดูว่าผลลัพธ์คืออะไรก่อนที่หน้าต่างจะหายไป
Rick

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"'

6
เพื่อความปลอดภัยอีกเล็กน้อยฉันขอแนะนำให้ใช้ExecutionPolicy RemoteSignedเพื่อให้สคริปต์สุ่มที่ดาวน์โหลดจากเครือข่าย / อินเทอร์เน็ต (ด้วยข้อมูลเมตาที่แสดงว่าไม่ได้สร้างขึ้นในเครื่อง) จะไม่ดำเนินการจากการดับเบิลคลิก แต่ไฟล์ใด ๆ ที่คุณสร้างขึ้นโดยการคัดลอกและ การวางโค้ดลงในไฟล์. ps1 จะดำเนินการเนื่องจากไม่มีข้อมูลเมตาที่เชื่อมโยงอยู่
dragon788

7
  1. นำทาง REGEDIT ไปที่ HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shell
  2. ในบานหน้าต่างด้านขวาคลิกสองครั้งที่ "(ค่าเริ่มต้น)"
  3. ลบค่าที่มีอยู่ของ "Open" (ซึ่งเปิดใช้งาน Notepad) และพิมพ์ "0" (เป็นศูนย์ซึ่งจะเรียกใช้ Powershell โดยตรง)

เปลี่ยนกลับค่าถ้าคุณต้องการใช้ Notepad เป็นค่าเริ่มต้นอีกครั้ง


5

คุณสามารถตั้งค่าการเชื่อมโยงไฟล์เริ่มต้นของps1ไฟล์เป็นpowershell.exeซึ่งจะช่วยให้คุณสามารถรันสคริปต์ powershell ได้โดยดับเบิลคลิกที่มัน

ใน 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

ใส่ไฟล์. cmd ง่ายๆในโฟลเดอร์ย่อยของฉันด้วยไฟล์. ps1 ที่มีชื่อเดียวกันตัวอย่างเช่นสคริปต์ชื่อ "foobar" จะมี "foobar.ps1" และ "foobar.cmd" ดังนั้นในการเรียกใช้. ps1 สิ่งที่ฉันต้องทำคือคลิกไฟล์. cmd จาก explorer หรือเรียกใช้. 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 ของฉันมีพารามิเตอร์ฉันจะแจ้งให้พร้อมกับ GUI พร้อมต์โดยใช้แบบฟอร์ม. NET แต่ยังทำให้สคริปต์มีความยืดหยุ่นเพียงพอที่จะรับพารามิเตอร์หากฉันต้องการส่งผ่านแทน ด้วยวิธีนี้ฉันสามารถดับเบิลคลิกได้จาก Explorer และไม่จำเป็นต้องรู้รายละเอียดของพารามิเตอร์เนื่องจากจะถามสิ่งที่ฉันต้องการพร้อมกล่องรายการหรือแบบฟอร์มอื่น ๆ


2
ขอบคุณสำหรับไฟล์แบตช์ ขอแจ้งให้ทราบว่าคุณสามารถแทนที่คำสั่ง "for" ด้วยเพียง: "set SCRIPT_PATH =% ~ p0" (โดยไม่มีเครื่องหมายคำพูด) อันที่จริงฉันจะใช้ ~ dp0 แทน ~ p0 ดังนั้นมันจะใช้ได้กับไดรฟ์ ฉันจะใช้มันเอง
zumalifeguard

3

หากคุณคุ้นเคยกับการดูแลระบบ Windows ขั้นสูงคุณสามารถใช้แพ็คเกจ ADM นี้ (มีคำแนะนำอยู่ในหน้านั้น) และอนุญาตให้เรียกใช้สคริปต์ PowerShell หลังจากดับเบิลคลิกผ่านเทมเพลตนี้และ Local GPO หลังจากนี้คุณสามารถเปลี่ยนโปรแกรมเริ่มต้นที่เชื่อมโยงกับประเภทไฟล์. psd เป็นpowershell.exe(ใช้การค้นหามันค่อนข้างถูกซ่อนไว้) และคุณพร้อมที่จะเรียกใช้สคริปต์ PowerShell ด้วยการดับเบิลคลิก

มิฉะนั้นฉันขอแนะนำให้ปฏิบัติตามคำแนะนำอื่น ๆ เนื่องจากคุณอาจทำให้ระบบทั้งหมดยุ่งเหยิงด้วยเครื่องมือการดูแลระบบเหล่านี้

ฉันคิดว่าการตั้งค่าเริ่มต้นเข้มงวดเกินไป หากมีคนจัดการใส่รหัสที่เป็นอันตรายในคอมพิวเตอร์ของคุณเขา / เธอก็สามารถข้ามข้อ จำกัด นี้ได้เช่นกัน (ห่อเป็นไฟล์. cmd หรือ. exe หรือหลอกด้วยทางลัด) และสิ่งที่ทำได้ในท้ายที่สุดก็เป็นเพียงการป้องกัน จากวิธีง่ายๆในการรันสคริปต์ที่คุณเขียน


เมื่อติดตั้งแล้วคุณจะพบการตั้งค่านี้ใน "Local Group Policy Editor" ภายใต้: Local Computer Policy -> Computer Configuration -> Administrative Templates -> Windows Components คุณสามารถเปิดใช้งานได้ที่นั่นและตรวจสอบให้แน่ใจว่าได้เลือกนโยบายในรายการแบบเลื่อนลงที่เปิดใช้งานแล้ว
Wouter

2

นี่เป็นไปตามคำตอบของ KoZm0kNoT ฉันแก้ไขให้ใช้งานได้กับไดรฟ์

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

จำเป็นต้องใช้ pushd / popds สองรายการในกรณีที่ cwd ของผู้ใช้อยู่ในไดรฟ์อื่น หากไม่มีการตั้งค่าภายนอก cwd บนไดรฟ์ที่มีสคริปต์จะหายไป


2

นี่คือสิ่งที่ฉันใช้เพื่อให้ scrips ทำงานในฐานะผู้ดูแลระบบโดยค่าเริ่มต้น:

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

ฉันพยายามตอบคำถามนี้มากที่สุด แต่พบข้อความแสดงข้อผิดพลาด จากนั้นฉันพบคำตอบที่นี่:

PowerShell ระบุว่า "การเรียกใช้สคริปต์ถูกปิดใช้งานในระบบนี้"

สิ่งที่ได้ผลดีสำหรับฉันคือการใช้วิธีนี้:

powershell -ExecutionPolicy Bypass -File script.ps1

คุณสามารถวางลงในไฟล์. bat และดับเบิลคลิกที่ไฟล์นั้น


วิธีนี้ใช้ได้ผลสำหรับฉันและฉันคิดว่านี่ดีกว่าวิธีการตัดสั้น
เบ็น

1

คุณสามารถใช้ฟังก์ชัน 'SendTo' ของ Windows เพื่อทำให้การเรียกใช้สคริปต์ PS1 ง่ายขึ้น ใช้วิธีนี้คุณสามารถคลิกขวาที่สคริปต์ PS1 และดำเนินการ นี่ไม่ได้ตอบคำถาม OP อย่างแน่นอน แต่ใกล้เคียง หวังว่านี่จะเป็นประโยชน์กับคนอื่น ๆ BTW .. สิ่งนี้มีประโยชน์สำหรับงานอื่น ๆ ที่หลากหลาย

  • ค้นหา / ค้นหา Powershell.exe
  • คลิกขวาที่ Powershell.exe แล้วเลือก Open File Location
  • คลิกขวาที่ Powershell.exe แล้วเลือก Create Shortcut บันทึกสถานที่ไว้ชั่วคราวเช่นเดสก์ท็อปของคุณ
  • คุณอาจต้องการเปิดเป็นผู้ดูแลระบบโดยค่าเริ่มต้น เลือกทางลัด> คุณสมบัติ> ขั้นสูง> เปิดในฐานะผู้ดูแลระบบ
  • เปิดโฟลเดอร์ Sendto เริ่ม> เรียกใช้> เชลล์: Sendto
  • ย้ายทางลัด Powershell.exe ไปที่โฟลเดอร์ Sendto
  • ตอนนี้คุณควรคลิกขวาที่สคริปต์ PS1 ได้แล้ว
  • คลิกขวาที่ไฟล์ PS1 เลือกตัวเลือกบริบท SendTo> เลือกทางลัด Powershell
  • สคริปต์ PS1 ของคุณควรดำเนินการ

1
สิ่งนี้ดีกว่าตัวเลือกเมนูบริบท "Run with Powershell" ที่เป็นค่าเริ่มต้นอย่างไร
elBradford

1

ฉันใช้สิ่งนี้ (ต้องเรียกใช้เพียงครั้งเดียว); ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ดำเนินการ:

จาก PowerShell ด้วยสิทธิ์ที่สูงขึ้น:

Set-ExecutionPolicy=RemoteSigned

จากไฟล์ bat:

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

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

 assoc .ps1=Microsoft.PowerShellScript.1

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

และ voila; ดับเบิลคลิกที่ * .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 (ใช้ notepad ++ ปล่อยสองสตริงบันทึกเป็นไฟล์ runme.cmd )
Paul Fijma

1

ใน Windows 10 คุณอาจต้องการลบการแทนที่ของ Windows Explorer สำหรับการเชื่อมโยงนามสกุลไฟล์:

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.