วิธีสร้างทางลัดโดยใช้ PowerShell


92

ฉันต้องการสร้างทางลัดด้วย PowerShell สำหรับปฏิบัติการนี้:

C:\Program Files (x86)\ColorPix\ColorPix.exe

จะทำได้อย่างไร?


2
หากคุณต้องการเรียกใช้ทางลัดในฐานะผู้ดูแลระบบคุณสามารถใช้คำตอบนี้ได้
JPBlanc

คุณควรพิจารณายอมรับคำตอบของ @JPBlanc อย่างจริงจัง เป็นซับเดียว
Kolob Canyon

@KolobCanyon ระวังคำตอบของฉันคือลิงก์สัญลักษณ์ไม่ใช่ทางลัด
JPBlanc

คำตอบ:


143

ฉันไม่รู้จัก cmdlet ดั้งเดิมใด ๆ ใน powershell แต่คุณสามารถใช้ com object แทนได้:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$Home\Desktop\ColorPix.lnk")
$Shortcut.TargetPath = "C:\Program Files (x86)\ColorPix\ColorPix.exe"
$Shortcut.Save()

คุณสามารถสร้างสคริปต์ powershell บันทึกเป็น set-shortcut.ps1 ใน $ pwd ของคุณ

param ( [string]$SourceExe, [string]$DestinationPath )

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Save()

และเรียกแบบนี้

Set-ShortCut "C:\Program Files (x86)\ColorPix\ColorPix.exe" "$Home\Desktop\ColorPix.lnk"

หากคุณต้องการส่งผ่านอาร์กิวเมนต์ไปยัง exe เป้าหมายสามารถทำได้โดย:

#Set the additional parameters for the shortcut  
$Shortcut.Arguments = "/argument=value"  

ก่อน $ Shortcut บันทึก ()

เพื่อความสะดวกนี่คือ set-shortcut.ps1 เวอร์ชันแก้ไข ยอมรับอาร์กิวเมนต์เป็นพารามิเตอร์ที่สอง

param ( [string]$SourceExe, [string]$ArgumentsToSourceExe, [string]$DestinationPath )
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($DestinationPath)
$Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe
$Shortcut.Save()

1
น้อยมาก แต่เพื่อความสอดคล้องฉันจะมีไวยากรณ์ของSet-ShortCutcmdlet ที่จะเป็นมากกว่าMKLINKนี้หรือSet-Aliasที่นามแฝงหรือลิงค์มาเป็นอาร์กิวเมนต์แรกแล้วตามด้วยเป้าหมาย param ( [string]$LinkPath, [string]$TargetPath )
orad

ข้อ จำกัด อย่างหนึ่งของคอมโพเนนต์ WshShell COM หรือcmd /c mklinkวิธีแก้ปัญหาคือชุดอักขระที่ จำกัด มากสำหรับการตั้งชื่อไฟล์. lnk ชื่อที่มี→จะล้มเหลวเช่น วิธีหนึ่งในการแก้ปัญหานี้หากคุณต้องการการสนับสนุนอักขระที่ดีกว่าคือการ[Web.HttpUtility]::UrlEncode()(หลังAdd-Type -AN System.Web) ชื่อไฟล์ในขณะที่สร้างไฟล์. lnk จากนั้นเปลี่ยนชื่อเป็นชื่อ UrlDecoded โดยใช้ Rename-Item
brianary

เมื่อสร้างช็อตคัทบนเดสก์ท็อปจริง (ซึ่งตรงข้ามกับการสมมติว่าเป็นเส้นทางแบบฮาร์ดโค้ดซึ่งอาจเป็นจริงหรือไม่ก็ได้ซึ่งเป็นความผิดปกติที่ฉันสังเกตเห็นหลายครั้ง) SpecialFoldersวิธีการของวัตถุ WScript อาจมีประโยชน์: $WshShell.SpecialFolders("Desktop")จะให้เส้นทางที่แท้จริงแก่คุณ CreateShortcutโฟลเดอร์สก์ท็อปที่คุณอาจจะใช้ต่อมาเมื่อโทร
60

ฉันใช้วิธีนี้กับPS C:\Users\${myUser} $Shortcut = $WshShell.CreateShortcut("$C:\Users\${myUser}\home.lnk"). มันสร้างทางลัดที่สามารถมองเห็นได้จาก windows explorer แต่เมื่อฉันพิมพ์cd homeใน PS ฉันได้รับข้อผิดพลาดcd : Cannot find path 'C:\Users\carpb\home' because it does not exist.
Ben Carp

47

เริ่มต้น PowerShell 5.0 New-Item, Remove-ItemและGet-ChildItemได้รับการปรับปรุงเพื่อสนับสนุนการสร้างและการจัดการการเชื่อมโยงสัญลักษณ์ ItemTypeพารามิเตอร์สำหรับการNew-Itemยอมรับค่าใหม่ SymbolicLink ตอนนี้คุณสามารถสร้างลิงก์สัญลักษณ์ในบรรทัดเดียวได้โดยเรียกใช้ New-Item cmdlet

New-Item -ItemType SymbolicLink -Path "C:\temp" -Name "calc.lnk" -Value "c:\windows\system32\calc.exe"

ต้องระวังSymbolicLinkแตกต่างจากทางลัดทางลัดเป็นเพียงไฟล์ มีขนาด (ขนาดเล็กที่อ้างอิงเพียงจุดที่ชี้) และต้องการแอปพลิเคชันเพื่อรองรับไฟล์ประเภทนั้นจึงจะใช้งานได้ ลิงก์สัญลักษณ์คือระดับระบบไฟล์และทุกอย่างจะเห็นว่าเป็นไฟล์ต้นฉบับ แอปพลิเคชันไม่ต้องการการสนับสนุนพิเศษในการใช้ลิงก์สัญลักษณ์

อย่างไรก็ตามหากคุณต้องการสร้างทางลัดRun As Administratorโดยใช้ Powershell คุณสามารถใช้ได้

$file="c:\temp\calc.lnk"
$bytes = [System.IO.File]::ReadAllBytes($file)
$bytes[0x15] = $bytes[0x15] -bor 0x20 #set byte 21 (0x15) bit 6 (0x20) ON (Use –bor to set RunAsAdministrator option and –bxor to unset)
[System.IO.File]::WriteAllBytes($file, $bytes)

ถ้าใครต้องการบางสิ่งบางอย่างเปลี่ยนแปลงอื่นในไฟล์ .lnk คุณสามารถดูเอกสารไมโครซอฟท์อย่างเป็นทางการ


4
เป็นไปได้หรือไม่ที่จะตั้งค่าไอคอนสำหรับทางลัด
orad

7
symlink แตกต่างจากทางลัดมาก symlink ที่สร้างโดยใช้New-Itemin "${env:AppData}\Microsoft\Windows\SendTo"จะไม่แสดงในเมนู Explorer Send To เช่นและไม่อนุญาตให้ปรับแต่งคุณสมบัติ Shortcut เช่นไอคอนหรือไดเร็กทอรีการทำงาน
brianary

ถ้าฉันเข้าใจถูกต้องหากคุณตั้งค่าลิงก์สัญลักษณ์สามารถใช้ทางลัดจากเชลล์ใดก็ได้และจากไดเร็กทอรีใดก็ได้ มันเหมือนกับการตั้งค่าระบบต่างๆ ถูกต้องหรือไม่ คุณสามารถใช้สำหรับไดเรกทอรีได้หรือไม่?
Ben Carp

1
มันน่าแปลกใจว่า PowerShell Dev ค่อนข้างได้เราเขียนบิดเบี้ยวและไม่สามารถเข้าใจได้เช่นรหัสที่ปรากฏข้างต้นแทนเพียงการดำเนินการ 3 New-Item -ItemType SymbolicLink -RunAsAdmin ...สายเป็นพารามิเตอร์ใหม่เช่นนี้
not2qubit

1
@Luke แต่แน่นอนว่ามันเป็นลิงก์ explorer ดังนั้นเมื่อคุณดับเบิลคลิกที่มันจะเริ่มต้น calc.exe ดังนั้นเมื่อคุณเริ่มต้นด้วย PowerShell ( & C:\temp\calc.lnk) คุณคาดหวังอะไร ?
JPBlanc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.