Script di PowerShell in PostBuild
-
03-07-2019 - |
Domanda
Integrazione continua
Ho lavorato su uno script di PowerShell per semplificare il nostro processo di sviluppo. Stavo programmando di gestirlo come evento post-build, ma ho qualche problema.
Dal prompt di PowerShell, funziona perfettamente:
PS C:\> ./example.ps1
Tuttavia, quando si tenta di eseguirlo da cmd.exe
come segue:
C:\> powershell -command "&\"C:\path to script\example.ps1\""
Lo script viene eseguito ma ricevo una serie di errori da PowerShell, che consiste principalmente in errori di risoluzione del percorso dalla funzione resolve-path
:
Percorso di risoluzione: Impossibile trovare il percorso 'C: \ Documents and Settings \ bdunbar \ My Documents \ Visual Studio 2008 \ Projects \ CgmFamilyComm \ FamilyComm \ iirf \ cms \ isapirewrite4.dl perché non esiste. In C: \ Documents and Settings \ bdunbar \ My Documents \ Visual Studio 2008 \ Projects \ C gmFamilyComm \ scripts \ cms.ps1: 4 char: 27 + $ iirfpath = (percorso di risoluzione < < < < ../iirf/cms/isapirewrite4.dll).path,
Percorso di risoluzione: Impossibile trovare il percorso 'C: \ Documents and Settings \ bdunbar \ My Documents \ Visual Studio 2008 \ Projects \ CgmFamilyComm \ FamilyComm \ familycomm 'perché lo fanno non esiste. In C: \ Documents and Settings \ bdunbar \ My Documents \ Visual Studio 2008 \ Projects \ C gmFamilyComm \ scripts \ cms.ps1: 5 char: 27 + $ vdirpath = (resol-path < < < < ../familycomm).path
C'è un modo per aggirare questo? Potrebbe essere un problema con l'esecuzione di <=> in <=>?
[Aggiornamento]
Sono stato in grado di cambiare le cose per aggirare gli errori che si verificano, ma ricevo ancora errori che funzionano perfettamente dal prompt dei comandi di PowerShell. Non riesco a capire quale sia la differenza.
Soluzione
Ho fatto questo lavoro in passato (vedi http: // sharepointpdficon.codeplex.com/SourceControl/changeset/view/13092#300544 se interessati):
C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 \ powershell.exe -NoLogo -NonInteractive -Command. '$ (ProjectDir) Deployment \ PostBuildScript.ps1' -ProjectDir: '$ (ProjectDir)' -ConfigurationName: '$ (ConfigurationName)' -TargetDir: '$ (TargetDir)' -TargetFileName: '$ (TargetFileName)' -TargetName: '$ (TargetName)
Quindi lancia questi parametri nella prima riga dello script post-build (se pensi di essere in grado di usarli):
param($ProjectDir, $ConfigurationName, $TargetDir, $TargetFileName)
Inoltre dovrei sottolineare che non lo sto usando attualmente. Mi è piaciuto usarlo come un rapido scratchpad per ricaricare i dati dei test per l'esecuzione dei test di integrazione.
Altri suggerimenti
Sembra che il tuo problema sia come vengono risolti i percorsi relativi. I percorsi relativi vengono risolti in base alla posizione corrente (memorizzata in $pwd
) e non in base alla posizione dello script. Quindi, se avessi lanciato lo script da C:\
, sicuramente non avrebbe funzionato.
Ti suggerirei di calcolare i percorsi in base a un argomento (come mostra Peter Seale) o di prendere la posizione effettiva dello script da:
$MyInvocation.MyCommand.Path