โพสต์เหตุการณ์สร้างเรียกใช้ PowerShell


87

เป็นไปได้ไหมที่จะตั้งค่าโปรเจ็กต์. NET ด้วยเหตุการณ์การสร้างโพสต์เพื่อเรียกใช้สคริปต์พาวเวอร์เชลล์ ฉันใช้สคริปต์นี้เพื่อสร้างไฟล์บางไฟล์

นอกจากนี้ฉันยังสามารถส่งผ่านไม่ว่าจะเป็นการดีบักหรือบิวด์ไปยังสคริปต์ ตัวอย่างนี้จะดีมาก


คำตอบ:


121

นี่คือตัวอย่าง:

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

Set-ExecutionPolicy RemoteSigned

กล่าวถึงเป็นพิเศษที่นี่ : หากคุณใช้ระบบ 64bits คุณต้องดูแลความจริงที่ว่า'devenv.exe ' ที่ปฏิบัติการ Visual Studio 2010 นั้นเป็น exe 32 บิตดังนั้นคุณต้องอนุญาตให้ PowerShell 32 รันสคริปต์

เมื่ออยู่ที่นี่คุณสามารถเข้าไปในคุณสมบัติโครงการของคุณและกำหนดค่าการสร้างโพสต์ตามที่แสดงไว้ที่นี่ด้านล่าง (ขออภัยในภาษาฝรั่งเศส):

โพสต์สร้างใน VS 2010

ตัวอย่างเช่น :

ตัวอย่าง postbuild ที่มี powershell

นี่คือไฟล์ ' psbuild.ps1' ซึ่งจะสร้าง ' test.txt' ในเส้นทางเป้าหมายโดยมีชื่อการกำหนดค่าอยู่ภายใน ฉันใส่ความคิดเห็นวิธีต่างๆในการดีบักสคริปต์ postbuild ของคุณ (กล่องข้อความเสียงข้อความบนเอาต์พุต)

param ([string]$config, [string]$target)

#[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#[void][System.Windows.Forms.MessageBox]::Show("It works.")
#[Console]::Beep(600, 800)
#Write-Host 'coucou'
set-content $target -Value $config -Force

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

2
คุณทดสอบเพื่อดาวน์โหลดไฟล์. PS1 บนไดรฟ์ Fat32 หรือ tu ใช้ cmdline FTP พื้นฐานเพื่อดาวน์โหลดไฟล์. PS1 ด้วย "remotesigned"? มันไม่ใช่ "ความปลอดภัยแบบควัน" หรือ?
JPBlanc

3
+1 สำหรับการกล่าวถึงเป็นพิเศษสำหรับระบบ 64 บิต - ฉันแทบคลั่งจนกระทั่งฉันได้อ่านฉันต้องอนุญาตให้ดำเนินการใน PowerShell 32 บิตด้วย ขอบคุณ!
Guðmundur H

โชคร้ายไม่มีไฟล์ภาพ: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna

7
หากคุณใช้: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe สำหรับพา ธ เวอร์ชัน 64 บิตของ powershell จะถูกเรียกใช้ % systemroot% \ sysnative เป็นนามแฝงพิเศษเพื่อบอกตัวเปลี่ยนเส้นทางให้หยุดการเปลี่ยนเส้นทางและอนุญาตให้เข้าถึง% systemroot% \ system32 ได้จริง
Peter Oehlert

15

คำสั่ง Set-ExecutePolicy จะตั้งค่านโยบายการดำเนินการชั่วคราวภายใต้เซสชันปัจจุบัน หากคุณตั้งค่านี้ใน powershell และเรียกใช้คำสั่ง post build ใน vs คุณจะยังไม่ได้รับอนุญาต ดังนั้นตั้งค่าก่อนแล้วเรียกใช้สคริปต์ ps1 ของคุณเช่นร้อง

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)

11

แทนที่จะยุ่งกับการตั้งค่าทั้งระบบและต้องแยกความแตกต่างระหว่างสภาพแวดล้อม 32 และ 64 บิตวิธีการที่ง่ายและเชื่อถือได้มากขึ้นคือการระบุExecutionPolicyในการเรียกใช้ PowerShell ดังต่อไปนี้:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted

PS C:\Users\xyz> Get-ExecutionPolicy
Unrestricted

PS C:\Users\xyz> exit

C:\Users\xyz>PowerShell -ExecutionPolicy RemoteSigned

PS C:\Users\xyz> Get-ExecutionPolicy
RemoteSigned

หมายเหตุในรหัสด้านบนวิธีการโทร Get-ExecutionPolicyบอกโหมดปัจจุบันอย่างไร นอกจากนี้โปรดสังเกตว่าโหมดนี้ระบุไว้อย่างไรในการเรียกใช้ PowerShell เองซึ่งสามารถรวมกับชื่อไฟล์สคริปต์:

test.ps1 เนื้อหา:

echo ('The current policy is ' + (Get-ExecutionPolicy)).ToString()

การเรียกใช้ test.ps1 ด้วยUnrestrictedนโยบายบนระบบที่ปิดใช้งานสคริปต์:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted -file test.ps1
The current policy is Unrestricted

นอกจากนี้โปรดทราบว่าการเรียกข้างต้นไม่ต้องการสิทธิ์ของผู้ดูแลระบบดังนั้นจึงสามารถเรียกได้ในขั้นตอนก่อนสร้างของ Visual Studio หรือที่คล้ายกัน


9

ก่อนที่จะเรียกสคริปต์พาวเวอร์เชลล์จากวิชวลสตูดิโอให้ตั้งค่า ExecutionPolicy เป็นRemoteSignedจากหน้าต่างพาวเวอร์เชลล์เช่นนี้ ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

จากนั้นเรียกสคริปต์ powershell ในลักษณะต่อไปนี้ ...

(ไม่จำเป็นต้องส่งเส้นทางไฟล์ "powershell.exe" แบบเต็ม)

powershell.exe $(SolutionDir)Setup.ps1 -SolutionDir $(SolutionDir) -ProjectPath $(ProjectPath)

ใส่คำอธิบายภาพที่นี่

จากนั้นในสคริปต์คุณสามารถอ่านพารามิเตอร์เช่นนี้ได้ตลอดเวลา ...

param([string]$SolutionDir,
     [string]$ProjectPath);
#Write-Host ($SolutionDir +" Call this script with following aruments");
#Write-Host ($ProjectPath +" Call this script with following aruments");

6

ฉันสร้างด้วยคำสั่งด้านล่างในคำสั่ง post-build:

PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(SolutionDir)AutomationScript\DBAutomationScript.ps1 -target $(SolutionDir)MUFG.SECMOD.Data\SqlScripts -generatedFileName $(SolutionDir)MUFG.SECMOD.Data\SqlScripts\DeploymentDBScript.sql

เนื้อหา DBAutomationScript.ps1:

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