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 ด้วยเช่นกัน หากคุณมีโปรไฟล์ที่สร้างไว้แล้ว โปรไฟล์เหล่านั้นจะถูกละเว้น และหากคุณตัดสินใจในภายหลังว่าจะใช้ประโยชน์จากสคริปต์โปรไฟล์ใดๆ สคริปต์เหล่านั้นก็พร้อมให้คุณแก้ไขแล้ว
เรียนรู้ เพลิดเพลิน และมีวันหยุดสุดสัปดาห์ที่ยอดเยี่ยม



