Question chaine de caractères avec des "$"
- vlb
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
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...
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.
- vlb
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
cscript c:\sources\xcacls.vbs P:\ /E /G $env:computername\`\"$SQLServer2005ReportServerUser`\":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.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
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 \"nom\" 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 = \"Richard Lazaro\"
\"Bonjour, je suis $nom\"
[/code:1]
Bonjour, je suis Richard Lazaro
Chaîne de caractères non interprétées :
[code:1]
$nom = \"Richard Lazaro\"
'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 = \"Richard Lazaro\"
\"Le contenu de la varaible `$nom est '$nom'\"
[/code:1]
Le contenu de la varaible $nom est 'Richard Lazaro'
Donc tu as plusieurs possibilité :
[code:1]
[string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser`$\"+ $env:computername +\"`$\"+ $instanceName)
[string]$SQLServer2005ReportServerUser = ('SQLServer2005ReportServerUser$'+ $env:computername +'$'+ $instanceName)
[string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser`$$($env:computername)`$$instanceName\"«»)
[/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 }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- vlb
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
Donc tu as plusieurs possibilité :
[code:1]
[string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser`$\"+ $env:computername +\"`$\"+ $instanceName)
[string]$SQLServer2005ReportServerUser = ('SQLServer2005ReportServerUser$'+ $env:computername +'$'+ $instanceName)
[string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser`$$($env:computername)`$$instanceName\"«»)
[/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 \"$\" :
[code:1]
PS C:\sources> [string]$SQLServer2005ReportServerUser = (\"SQLServer2005ReportServerUser`$\"+ $env:computername +\"`$\"+ $in
stanceName)
PS C:\sources> $SQLServer2005ReportServerUser
SQLServer2005ReportServerUser$T-2K3R2-X86-STD$SQLFLEX
PS C:\sources> 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:
\"C:\sources\"
Arguments Used:
Filename = \"P:\SQL Server\MSSQL.1\MSSQL\TempDB\"
/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> cscript c:\sources\xcacls.vbs $TempDB /E /G $env:computername\`\"$SQLServer2005ReportServerUser`\":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:
\"C:\sources\"
Arguments Used:
Filename = \"P:\SQL Server\MSSQL.1\MSSQL\TempDB\"
/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 \"T-2K3R2-X86-STD\SQLServer2005ReportServerUser
$T-2K3R2-X86-STD$SQLFLEX\"
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:
`\"$SQLServer2005ReportServerUser`\":
Vincent
Dans le doute, reboot...
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- chaine de caractères avec des "$"