กำหนดค่า Windows Powershell เพื่อแสดงเฉพาะชื่อโฟลเดอร์ปัจจุบันในพร้อมท์เชลล์


37

ฉันใช้ Powershell ใน Windows 7 วิธีกำหนดค่า Powershell เพื่อให้แสดงเฉพาะชื่อโฟลเดอร์ปัจจุบัน (แทนที่จะเป็นพา ธ เต็ม) ในเชลล์พรอมต์?

ตัวอย่างเช่นแทนที่จะฉันต้องการC:\folder\directory\name>name>

คำตอบ:


57

คุณต้องกำหนดฟังก์ชั่นพรอมต์ในโปรไฟล์ PowerShell ของคุณ ( %userprofile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1); อาจว่างเปล่าหรือไม่มีอยู่หากคุณไม่เคยแก้ไขมาก่อน

  1. เปิดโปรไฟล์ของคุณ (เช่นเปิดไฟล์ดังกล่าวหรือขณะที่อยู่ใน PowerShell Notepad $profile)

  2. เพิ่มสิ่งต่อไปนี้ในโปรไฟล์ของคุณ:

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  3. บันทึกโปรไฟล์

  4. เริ่ม PowerShell ใหม่

    ไม่จำเป็น หากคุณได้รับข้อความที่ระบุว่าคุณไม่ได้รับอนุญาตให้เรียกใช้สคริปต์คุณต้องคัดลอก / วางบรรทัดนี้ใน PowerShell:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    และรีสตาร์ท

นโยบายการดำเนินการ Windows PowerShell ช่วยให้คุณกำหนดเงื่อนไขภายใต้ Windows PowerShell ที่โหลดไฟล์การกำหนดค่าและเรียกใช้สคริปต์

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

ที่มา: เอกสาร Microsoft


1
ไม่ถูกต้องนัก [System.IO.Directory]::GetCurrentDirectory()ไม่ได้แสดงตำแหน่งปัจจุบันของ powershell แต่เป็นไดเรกทอรีการทำงานของกระบวนการซึ่งไม่เหมือนกันเสมอไป แทนที่ด้วยGet-Location
zdan

+1 GetCurrentDirectoryแต่ผมจะใช้รับตำแหน่งแทน โปรดจำไว้ว่า PowerShell ไม่ได้หมายถึงระบบไฟล์เสมอไป ใช้สแนปอินรีจิสทรีฉันสามารถใช้cd hkcu:และตอนนี้พรอมต์จะถูกปิดโดยสิ้นเชิง
vcsjones

@Synetech มันฝังลึกในความช่วยเหลือในการจัดรูปแบบ: \
Bob

1
คุณสามารถใช้$PWDแทนการโทรGet-Locationได้ เช่นfunction prompt { (Split-Path -Leaf $pwd) + '> ' }
Joey

1
คุณไม่จำเป็นต้องกำหนดpromptในไฟล์โปรไฟล์ของคุณ มันจะต้องอยู่ในขอบเขตเซสชันทั่วโลก เริ่มต้นดูเหมือนว่าเทียบเท่ากับfunction prompt {"PS " + (Get-Location) + ">"}ในขณะที่ช่วยให้เช่นเดียวกับfunction prompt {""} function prompt {"PS>"}ใช้function prompt {" `b"}เพื่อรับพรอมต์ที่ว่างเปล่า (อย่างน้อยก็ด้วยสายตา ... )
masterxilo

5

ในฐานะโน้ตเพิ่มเติมฉันไม่สามารถทำคำสั่งของ @ Synetech จนกว่าฉันจะสร้างโปรไฟล์ $ ครั้งแรก

  1. เปิด PowerShell
  2. พิมพ์$profileและกด Enter สิ่งนี้จะแสดงเส้นทางโปรไฟล์ PowerShell ที่ต้องใช้แม้ว่าจะไม่มีอยู่ (ไม่ใช่สำหรับฉัน) เส้นทางของฉันแตกต่างจากที่ @Synetech โพสต์ไว้ด้านบน

    >$profile
    C:\Users\[username]\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    
  3. ฉันต้องสร้างทั้งโฟลเดอร์ WindowsPowerShell และไฟล์ Microsoft.PowerShell_profile.ps1

  4. เพิ่มรหัสของ @ Synetech แล้วเริ่ม PowerShell ใหม่

บันทึก:

หากคุณใช้ posh-git (ซึ่งติดตั้งเมื่อใช้เดสก์ท็อป GitHub) สคริปต์ของ @ Synetech จะแทนที่พรอมต์ posh-git สคริปต์พรอมต์เพิ่มเติมสำหรับหรู-คอมไพล์ที่นี่


1
มันเหมือนกัน. %userprofile%ขยายไปที่C:\Users\[username]
DavidPostill

@DavidPostill นั่นเป็นความเข้าใจของฉัน แต่ PowerShell ของฉันไม่รู้จัก% userprofile% เป็นไดเรกทอรี ฉันไม่เชื่อว่า PowerShell ของฉันได้รับการปรับแต่งเพื่อให้รู้จักเส้นทางเหล่านั้นอาจเป็นเพราะการตั้งค่าเครือข่าย
ไบรอัน

2
ไวยากรณ์มีความแตกต่างใน PowerShell: $Env:userprofileเทียบเท่ากับecho %userprofile%
DavidPostill

$ profile มีค่าแตกต่างกันใน ISE เทียบกับพรอมต์ปกติคุณอาจต้องสร้าง 2 ไฟล์
Chris

3

เปลี่ยนพรอมต์เพื่อแสดงโฟลเดอร์ปัจจุบันที่ไม่มีเส้นทางแบบเต็มและใหญ่กว่าสัญลักษณ์ที่ส่วนท้าย:

วิธีหนึ่งอาจเป็น:

Function Prompt { "$( ( get-item $pwd ).Name )>" }

หรือ:

Function Prompt { "$( Split-Path -leaf -path (Get-Location) )>" }

หรือ:

Function Prompt { "$( ( Get-Location | Get-Item ).Name )>" }

ตัวแรกและตัวที่สามดีกว่าคำตอบที่ยอมรับซึ่งมันทำงานกับโฟลเดอร์เครือข่าย \\myserver\my\pathแยกเส้นทางจะไม่ทำงานอย่างถูกต้องบนเส้นทางเช่น
Chris

2

ผมพบว่าเรื่องนี้เป็นเรื่องง่ายสวย - รวม @ คำตอบ Synetech และข้อมูลที่พบในโปรไฟล์ PowerShell เพราะฉันเป็นมือใหม่สำหรับ PS ขั้นตอนของฉัน (สำหรับ vscode):

  1. test-path $ profile (ในพรอมต์คำสั่ง PS - มีการตั้งค่าโปรไฟล์หรือไม่)
  2. new-item -path $ profile - ไฟล์ชนิด -force (สมมติว่าคำตอบข้างต้นเป็นเท็จ)
  3. notepad $ profile (เปิด notepad)
  4. วางใน

    function prompt {
      $p = Split-Path -leaf -path (Get-Location)
      "$p> "
    }
    
  5. บันทึก (คุณไม่ควรเลือกสถานที่ แต่เป็นที่เรียบร้อยสำหรับคุณ)
  6. โหลด vscode - คุณอาจได้รับข้อความเกี่ยวกับการเรียกใช้สคริปต์ (หรือทำขั้นตอนต่อไปก่อนโหลดซ้ำ)
  7. Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (ที่พรอมต์ PS ของคุณจากคำตอบ SuperUse)

  8. โหลด vscode อีกครั้ง

ดังนั้นคำตอบของ @ Synetech ส่วนใหญ่ (upvoted) ที่มีการเริ่มต้นง่าย ๆ โดยเฉพาะขั้นตอนที่ 2 ทำให้ง่ายมาก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.