Mon script yml azure pipelines utilise PowerShell pour remplacer une chaîne d'espace réservé dans un fichier .CS par la chaîne de date actuelle. C'est la ligne avec la valeur à remplacer (20200101000000)

[assembly: MyCompany.Net.Attributes.BuildDateAttribute("20200101000000")]

C'est l'étape PowerShell qui le fait

pwsh: (get-content -path $(versionFile)) | foreach-object {$_ -replace "20200101000000", (get-date -f 'yyyyMMddhhmmss')} | set-content -path $(versionFile)
  displayName: 'Update time stamp file'

Je veux modifier cette étape pour inclure les caractères de citation " autour de la chaîne de recherche et les écrire dans la nouvelle valeur de sortie avec la nouvelle date. Mais je n'arrive pas à y arriver.

J'ai essayé par erreur de simplement mettre des guillemets échappés \" dans la recherche et remplacer des chaînes. Mais je suppose que vous ne pouvez pas vous échapper à l'intérieur d'une chaîne entre guillemets simples, donc cela n'a pas fonctionné

pwsh: (get-content -path $(versionFile)) | foreach-object {$_ -replace "\"20200101000000\"", (get-date -f '\"yyyyMMddhhmmss\"')} | set-content -path $(versionFile)

C'était l'erreur:

##[command]"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command ". 'D:\a\_temp\80625e52-1302-4e35-a799-223ab893bcf1.ps1'"
ParserError: D:\a\_temp\80625e52-1302-4e35-a799-223ab893bcf1.ps1:3
Line |
   3 |  … lyInfo.cs) | foreach-object {$_ -replace "\"20200101000000\"", (get-d …
     |                                                ~~~~~~~~~~~~~~~~~
     | Unexpected token '20200101000000\""' in expression or statement.
##[error]PowerShell exited with code '1'.

J'ai aussi essayé d'utiliser simplement des guillemets doubles autour de la partie get-date du script afin que je puisse échapper aux caractères de citation, mais cela ne semble pas non plus fonctionner. Je suppose que c'est une limitation de l'écriture de script de cette façon.

Existe-t-il un autre moyen de réaliser ce que je veux?

1
Joe 3 nov. 2020 à 21:43

2 réponses

Meilleure réponse

Le caractère d'échappement dans Powershell est un backtick (`), pas un backslash (\). Essayez par exemple "`"20200101000000`"".

0
Mark Reed 3 nov. 2020 à 19:09

Vous pouvez utiliser le Get-Date -UFormat à la place pour ajouter des caractères arbitraires similaires à la fonction DateTime.ToString() dans .NET

'[Attrib("20200101000000")]' -replace '"20200101000000"', (get-date -UFormat '"%Y%m%d%H%M%S"')
1
wp78de 3 nov. 2020 à 19:07