Question chaine de caractères avec des "$"

Plus d'informations
il y a 15 ans 1 semaine #9103 par vlb
Bonjour,

Je fais actuellement l'ajout d'un compte SQL \"SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX\" dans le répertoire \"P:\\" avec xcacls.vbs.

En manuel, tout va bien, la commande est la suivante :
[code:1]
PS C:\sources> cscript c:\sources\xcacls.vbs P:\ /E /G $env:computername\'SQLServer2005ReportServerUser$T-2K3R2-X86-STD$
SQLFLEX':F /SPEC B
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Starting XCACLS.VBS (Version: 5.2) Script at 3/8/2011 2:31:13 PM

Startup directory:
\"C:\sources\"

Arguments Used:
Filename = \"P:\\"
/E (Edit ACL leaving other users intact)
/G (Grant rights)
T-2K3R2-X86-STD\SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX:F
/SPEC (Special Folder Permission)
B - This Folder, Subfolders and Files



**************************************************************************
Directory: P:\
Granting NTFS rights (F access for This Folder, Subfolders and Files) for \"T-2K3R2-X86-STD\SQLServer2005ReportServerUser
$T-2K3R2-X86-STD$SQLFLEX\"
Completed successfully.
**************************************************************************
Operation Complete
Elapsed Time: 5.953125 seconds.
Ending Script at 3/8/2011 2:31:19 PM[/code:1]

Comme j'ai pu le faire pour d'autres choses, mon script est souple afin de s'adapter à tout type d'environnement, comprenant le nom de machine et l'instance nommée utilisée par le client.

Exemple

le groupe SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX est composé de différents types :
[code:1]
\"SQLServer2005ReportServerUser$\" = string
$env:computername = variable
\"$\" = string
$SQLFLEX = variable
[/code:1]

Ce qui donne au final par concaténation la variable suivante :
[code:1]
[string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser$\"+ $env:computername +\"$\"+ $instanceName)[/code:1]

Sous powershell, j'utilise xcacls.vbs avec des variables sans soucis.

Mais le fait d'avoir des \"$\" dans mon groupe est problématique j'ai l'impression.

Car la difficulté est de pouvoir \"entourer\" mon groupe de \"'\" (guillemets simples) afin de ne pas traduire les \"$\" mais de ne pas interpréter les \"'\".

J'ai lu les pages 67 à 69 du bouquin, et fait plein de test...:evil:

Je pensais que \"'\"+\"$SQLServer2005ReportServerUser\"+\"'\" serait ma solution, mais non, ça me donne un bon résultat en dehors de la commande mais pas à l'intérieur...

Il y a une subtilité que je ne m'explique pas avec la manipulation des chaines de caractères avec les guillemets.

Vincent

Message édité par: suchiwa, à: 8/03/11 15:55

Message édité par: suchiwa, à: 8/03/11 15:57<br><br>Message édité par: suchiwa, à: 8/03/11 15:58

Vincent

Dans le doute, reboot...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 semaine #9104 par vlb
Je pense avoir trouvé ceci

cscript c:\sources\xcacls.vbs P:\ /E /G $env:computername\`\&quot;$SQLServer2005ReportServerUser`\&quot;:F

le caractère d'échappement que je confondais avec un guillemet simple...

Vincent

Dans le doute, reboot...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 semaine #9105 par Richard Lazaro
Bonjour,

Il faut savoir qu'il y a deux types de chaînes de caractères :

- les doubles quotes, qui sont des chaînes interprétées. c'est à dire qu'une variable au sein de cette chaîne retournera la valeur et non le \&quot;nom\&quot; de la variable

- les simples quotes, qui sont des chaînes non interprétées

exemple :

Chaîne de caractères interprétées :
[code:1]
$nom = \&quot;Richard Lazaro\&quot;
\&quot;Bonjour, je suis $nom\&quot;
[/code:1]

Bonjour, je suis Richard Lazaro


Chaîne de caractères non interprétées :
[code:1]
$nom = \&quot;Richard Lazaro\&quot;
'Bonjour, je suis $nom'
[/code:1]

Bonjour, je suis $nom


Il faut noter que dans les chaînes interprétées, on peut échapper un caractère spécial (ici le $) avec le backtick ` (altgr+7)

Chaîne de caractères interprétées avec échappement :
[code:1]
$nom = \&quot;Richard Lazaro\&quot;
\&quot;Le contenu de la varaible `$nom est '$nom'\&quot;
[/code:1]

Le contenu de la varaible $nom est 'Richard Lazaro'


Donc tu as plusieurs possibilité :
[code:1]
[string]$SQLServer2005ReportServerUser = (\&quot;SQLServer2005ReportServerUser`$\&quot;+ $env:computername +\&quot;`$\&quot;+ $instanceName)

[string]$SQLServer2005ReportServerUser = ('SQLServer2005ReportServerUser$'+ $env:computername +'$'+ $instanceName)

[string]$SQLServer2005ReportServerUser = (\&quot;SQLServer2005ReportServerUser`$$($env:computername)`$$instanceName\&quot;«»)
[/code:1]

ou bien on peut aussi faire du formatage de chaîne de caractère :
[code:1]
[string]$SQLServer2005ReportServerUser = ('SQLServer2005ReportServerUser${0}${1}' -f $env:computername,$instanceName)
[/code:1]

J'espère avoir éclaircie ta demande.

Bien Cordialement,
Richard Lazaro.

Think-MS : (Get-Life).Days | %{ Learn-More }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 semaine #9107 par vlb
Réponse de vlb sur le sujet Re:chaine de caractères avec des
Richard Lazaro écrit:

Donc tu as plusieurs possibilité :
[code:1]
[string]$SQLServer2005ReportServerUser = (\&quot;SQLServer2005ReportServerUser`$\&quot;+ $env:computername +\&quot;`$\&quot;+ $instanceName)

[string]$SQLServer2005ReportServerUser = ('SQLServer2005ReportServerUser$'+ $env:computername +'$'+ $instanceName)

[string]$SQLServer2005ReportServerUser = (\&quot;SQLServer2005ReportServerUser`$$($env:computername)`$$instanceName\&quot;«»)
[/code:1]


Bonjour Richard,

Sauf erreur ou manquement de ma part, les possiblités ne sont pas multiples...

Ton exemple fonctionne très bien au sein même de la variable, pas de doute, les chaines de caractères sont valides.

J'ai essayé le premier exemple et ensuite injecté dans la commande xcacls. Le compte est ignoré car il ne voit pas encore l'ensemble du compte en une seule chaine de caractères comme 'SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX' mais SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX et interprète encore les \&quot;$\&quot; :

[code:1]
PS C:\sources&gt; [string]$SQLServer2005ReportServerUser = (\&quot;SQLServer2005ReportServerUser`$\&quot;+ $env:computername +\&quot;`$\&quot;+ $in
stanceName)
PS C:\sources&gt; $SQLServer2005ReportServerUser
SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX
PS C:\sources&gt; cscript c:\sources\xcacls.vbs $TempDB /E /G $env:computername\$SQLServer2005ReportServerUser:W
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Starting XCACLS.VBS (Version: 5.2) Script at 3/8/2011 4:50:51 PM

Startup directory:
\&quot;C:\sources\&quot;

Arguments Used:
Filename = \&quot;P:\SQL Server\MSSQL.1\MSSQL\TempDB\&quot;
/E (Edit ACL leaving other users intact)

Operation Complete
Elapsed Time: 0.046875 seconds.

Ending Script at 3/8/2011 4:50:51 PM
[/code:1]

Le problème ne se pose pas pour la variable en elle même, mais son interprétation dans le ligne de commande.

[code:1]
PS C:\sources&gt; cscript c:\sources\xcacls.vbs $TempDB /E /G $env:computername\`\&quot;$SQLServer2005ReportServerUser`\&quot;:F
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Starting XCACLS.VBS (Version: 5.2) Script at 3/8/2011 4:52:00 PM

Startup directory:
\&quot;C:\sources\&quot;

Arguments Used:
Filename = \&quot;P:\SQL Server\MSSQL.1\MSSQL\TempDB\&quot;
/E (Edit ACL leaving other users intact)
/G (Grant rights)
T-2K3R2-X86-STD\SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX:F
**************************************************************************
Directory: P:\SQL Server\MSSQL.1\MSSQL\TempDB
Granting NTFS rights (F access for This Folder, Subfolders and Files) for \&quot;T-2K3R2-X86-STD\SQLServer2005ReportServerUser
$T-2K3R2-X86-STD$SQLFLEX\&quot;
Completed successfully.
**************************************************************************
Operation Complete
Elapsed Time: 5.65625 seconds.
Ending Script at 3/8/2011 4:52:05 PM
[/code:1]

Comme je l'ai noté dans mon second post, c'est directement dans la ligne de script que je dois ajouter les caractères d'échappements:
`\&quot;$SQLServer2005ReportServerUser`\&quot;:

Vincent

Dans le doute, reboot...

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.065 secondes
Propulsé par Kunena