ค้นหาเว็บไซต์

Friday Fun: สร้างสคริปต์โปรไฟล์ PowerShell ทั้งหมด


เส้นทางโปรไฟล์เป็นแบบฮาร์ดโค้ด คุณสามารถดูทั้งหมดได้โดยดูที่ตัวแปร $profile ในตัว

PS C:\> $profile | select *

AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps
                         1
CurrentUserAllHosts    : C:\Users\Jeff\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Jeff\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length                 : 74

คุณยังสามารถดูเพียง $profile ซึ่งจะแสดงสคริปต์สำหรับผู้ใช้ปัจจุบันบนโฮสต์ปัจจุบัน หากคุณดูสิ่งนี้ใน ISE คุณจะเห็นว่าบางสิ่งแตกต่างออกไป

ตัวแปรนี้ค่อนข้างยุ่งยาก แม้ว่าคุณจะเห็นคุณสมบัติที่นี่ แต่ถ้าคุณไปป์ $profile ไปที่ Get-Member สิ่งที่คุณจะได้รับก็คือคำจำกัดความของสตริง นี่เป็นอีกวิธีหนึ่งที่คุณสามารถค้นพบสิ่งเหล่านี้ได้

PS C:\> $profile.psobject.properties | format-table Name,Value -auto

Name                   Value
----                   -----
AllUsersAllHosts       C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    C:\Users\Jeff\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost C:\Users\Jeff\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length                 74

แม้ว่าฉันจะไม่ได้สนใจเรื่องความยาวมากนัก ดังนั้นเรามากรองมันออกดีกว่า

PS C:\> $profile.psobject.properties | select -first 4 | format-table Name,Value -auto

Name                   Value
----                   -----
AllUsersAllHosts       C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    C:\Users\Jeff\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost C:\Users\Jeff\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

ตอนนี้เพื่อความสนุก ค่านั้นเป็นเส้นทางดังนั้นฉันจึงสามารถใช้ Test-Path เพื่อดูว่ามีอยู่หรือไม่ ถ้าไม่เช่นนั้น ฉันสามารถสร้างโปรไฟล์ได้ และอย่างน้อยก็ระบุได้ว่าไม่ได้ใช้งานอยู่ เนื่องจากไฟล์เหล่านี้ส่วนใหญ่ไม่มีอยู่ตามค่าเริ่มต้น และในความเป็นจริงแล้ว โฟลเดอร์ WindowsPowerShell ไม่มีอยู่ในเอกสารจนกว่าคุณจะสร้างมันขึ้นมา คุณอาจต้องสร้างโฟลเดอร์หลักก่อน ดังนั้นฉันจึงสร้างสคริปต์เล็กๆ ขึ้นมาชื่อ Create-AllProfiles.ps1

#requires -version 3.0

[cmdletbinding(SupportsShouldProcess=$True)]
Param()

$profile.psobject.properties.value[0..3] | where { -Not (Test-path $_)} |
foreach {
  #create the parent folder if it doesn't exist
  $parent = Split-Path $_
  if (-Not (Test-Path -path $parent)) {
    mkdir $parent
   }

  #create the profile with this text
  #the here string must be left justified
$txt=@"
#requires -version $($psversiontable.PSVersion)

<#
This profile is not used and intentionally left blank.
 $env:userdomain\$env:username
 $(Get-Date)
#>

"@ 

#write the text to the profile script
Write-Host "Creating $_" -ForegroundColor Green
$txt | Out-File -FilePath $_

}

สคริปต์ใช้ประโยชน์จากคุณลักษณะใน PowerShell 3 ที่จะระบุคุณสมบัติโดยอัตโนมัติ ใน PowerShell 2.0 ฉันจะต้องทำสิ่งนี้:

PS C:\> $profile.psobject.properties | select -ExpandProperty Value -first 4
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
C:\Users\Jeff\Documents\WindowsPowerShell\profile.ps1
C:\Users\Jeff\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

แต่ตอนนี้ใน v3 และใหม่กว่า ฉันสามารถทำได้:

PS C:\> $profile.psobject.properties.value[0..3]
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
C:\Users\Jeff\Documents\WindowsPowerShell\profile.ps1
C:\Users\Jeff\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

คุณสมบัติ value จะแสดงค่าทั้งหมด รวมถึงความยาวด้วย ดังนั้นเนื่องจากฉันได้รับอาร์เรย์ ฉันจึงสามารถใช้ช่วงของตัวเลขดัชนีเพื่อเลือกเฉพาะรายการที่ฉันต้องการได้ ในสคริปต์ของฉัน แต่ละค่าจะถูกทดสอบ และค่าที่ไม่มีอยู่จะถูกส่งต่อไปยัง Foreach-Object

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

ฉันลงเอยด้วยสคริปต์โปรไฟล์ที่มีลักษณะดังนี้:

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

เรียนรู้ เพลิดเพลิน และมีวันหยุดสุดสัปดาห์ที่ยอดเยี่ยม

บทความที่เกี่ยวข้อง