เป็นไปได้ไหมที่จะตั้งค่าโปรเจ็กต์. NET ด้วยเหตุการณ์การสร้างโพสต์เพื่อเรียกใช้สคริปต์พาวเวอร์เชลล์ ฉันใช้สคริปต์นี้เพื่อสร้างไฟล์บางไฟล์
นอกจากนี้ฉันยังสามารถส่งผ่านไม่ว่าจะเป็นการดีบักหรือบิวด์ไปยังสคริปต์ ตัวอย่างนี้จะดีมาก
เป็นไปได้ไหมที่จะตั้งค่าโปรเจ็กต์. NET ด้วยเหตุการณ์การสร้างโพสต์เพื่อเรียกใช้สคริปต์พาวเวอร์เชลล์ ฉันใช้สคริปต์นี้เพื่อสร้างไฟล์บางไฟล์
นอกจากนี้ฉันยังสามารถส่งผ่านไม่ว่าจะเป็นการดีบักหรือบิวด์ไปยังสคริปต์ ตัวอย่างนี้จะดีมาก
คำตอบ:
นี่คือตัวอย่าง:
ก่อนอื่น : คุณต้องตระหนักถึงข้อเท็จจริงที่ว่า PowerShell ต้องได้รับการกำหนดค่าเพื่อเรียกใช้สคริปต์ บรรทัดต่อไปนี้อนุญาตให้ PowerShell รันสคริปต์:
Set-ExecutionPolicy RemoteSigned
กล่าวถึงเป็นพิเศษที่นี่ : หากคุณใช้ระบบ 64bits คุณต้องดูแลความจริงที่ว่า'devenv.exe ' ที่ปฏิบัติการ Visual Studio 2010 นั้นเป็น exe 32 บิตดังนั้นคุณต้องอนุญาตให้ PowerShell 32 รันสคริปต์
เมื่ออยู่ที่นี่คุณสามารถเข้าไปในคุณสมบัติโครงการของคุณและกำหนดค่าการสร้างโพสต์ตามที่แสดงไว้ที่นี่ด้านล่าง (ขออภัยในภาษาฝรั่งเศส):
ตัวอย่างเช่น :
นี่คือไฟล์ ' 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
คำสั่ง Set-ExecutePolicy จะตั้งค่านโยบายการดำเนินการชั่วคราวภายใต้เซสชันปัจจุบัน หากคุณตั้งค่านี้ใน powershell และเรียกใช้คำสั่ง post build ใน vs คุณจะยังไม่ได้รับอนุญาต ดังนั้นตั้งค่าก่อนแล้วเรียกใช้สคริปต์ ps1 ของคุณเช่นร้อง
powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)
แทนที่จะยุ่งกับการตั้งค่าทั้งระบบและต้องแยกความแตกต่างระหว่างสภาพแวดล้อม 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 หรือที่คล้ายกัน
ก่อนที่จะเรียกสคริปต์พาวเวอร์เชลล์จากวิชวลสตูดิโอให้ตั้งค่า 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");
ฉันสร้างด้วยคำสั่งด้านล่างในคำสั่ง 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)