powershell question about argument

Hello,
I a script I check a condition on argument which contains comma but I does not work :

IF ($arg1 -eq "TEST,DB")

How can I modify it?

Thanks
bibi92Asked:
Who is Participating?
 
QlemoConnect With a Mentor Batchelor, Developer and EE Topic AdvisorCommented:
Doh! I mixed up -like and -match - either use
   if ($arg1 -like "*DB")
or
  if ($arg1 -match ".*DB")
0
 
SubsunCommented:
Did you try  with single quotes..
IF ($arg1 -eq 'TEST,DB') 

Open in new window

Also if you can post the complete script then it will be more convenient for us to give you suggestions..
0
 
Haresh NikumbhSr. Tech leadCommented:
0
Simplify Active Directory Administration

Administration of Active Directory does not have to be hard.  Too often what should be a simple task is made more difficult than it needs to be.The solution?  Hyena from SystemTools Software.  With ease-of-use as well as powerful importing and bulk updating capabilities.

 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
What the above link tries to tell is that if you provide the argument as an unquoted string containing commas, an array is built. Don't call your script like this:
   .\script.ps1 -arg1 1,2
because that will make $arg1 to consist of two string or numeric elements. Instead:
   .\script.ps1 -arg1 '1,2'
BTW, using single versus double quotes is not related to this issue.
0
 
Haresh NikumbhSr. Tech leadCommented:
Thanks I  will keep in mind next time.
0
 
bibi92Author Commented:

Open in new window

[string]$HOSTNAME = (Get-WmiObject Win32_Computersystem).Name
$COLSC=get-wmiobject -class win32_service -computername $hostname| where {$_.name -like '*SQL*'}| select-object Name,state,status,Started,Startname,displayname



if ($arg1 -match 'TEST') {

      
      foreach ($arg in $arg1) {
      $ofs =","
          $param = ([string] $arg).split("=")


      if ($arg1 -match 'TEST,DB') {

      foreach ($service in $COLSC) {

      $line_sc =  " { `"{#DBH}`":`"" + $HOSTNAME + "`",`"{#SC}`":`"" + $service.Name + "`"},"

      write-host $line_sc

      }
      }
      }
      }
0
 
SubsunCommented:
If you want to pass arguments to the script then you need to have parameters declared at the top of your script, in a param block:

param(
  [string]$Arg1
)

Open in new window

Is that what you looking for? if not please explain what you tying to achieve..
0
 
bibi92Author Commented:
Yes, it's already done. I have forgotten to copy this line on the post. Thanks
0
 
SubsunCommented:
if not please explain what you tying to achieve..
My question still stands.. Few lines in the script like $ofs =","$param = ([string] $arg).split("=") doesn't make any sense to me. So I think a bit of explanation on what you trying to achieve, will help us..

BTB: Hope you are running .\script.ps1 -arg1 'TEST,DB'
0
 
bibi92Author Commented:
$ofs ="," & $param = ([string] $arg).split("=") will be for testing http://stackoverflow.com/questions/7775487/why-does-powershell-replace-commas-with-whitespaces 

I can't execute .\script.ps1 -arg1 'TEST,DB' because the command is executed on zabbix userparameter
0
 
bibi92Author Commented:
I have to execute .\script.ps1 TEST,DB
0
 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
bibi,

Then you will have to "rejoin" the array to a single parameter, if you can't even use
  .\script.ps1 'TEST,DB'
That can be done like this:
param ([String []] $arg1)
$arg1 = $arg1 -join ','

Open in new window

Declaring $arg1 as an array of strings is important.
0
 
bibi92Author Commented:
Thanks but there is an error :
Unable to find type [String []]: make sure that the assembly containing this type is loaded.

+ param ([String []] <<<<  $arg1)
    + CategoryInfo          : InvalidOperation: (String []:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TypeNotFound
0
 
bibi92Author Commented:
$args = $arg1 -join ','

If I add echo $args, the result is TEST
0
 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
Sorry, there is a space where it isn't allowed. Use   [String[]]   instead of   [String []]  .
0
 
bibi92Author Commented:
Ok thanks.
With zabbix, it isn't OK, the script is executed like
UserParameter=sql_svc_control[TEST,DB],powershell -nologo -command "& d:\scripts\script.ps1 $1"

If I execute the script on powershell, it's Ok
powershell -nologo -command "& d:\scripts\script.ps1 TEST,DB"

Why?
0
 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
Put a
 write-host $arg1
 read-host

Open in new window

at the very beginning of the script to see what gets inserted for $1.
0
 
bibi92Author Commented:
The result is
TEST DB
So I have modified the script like
if ($arg1 -match 'DB') {

      foreach ($service in $COLSC) {

      $line_sc =  " { `"{#DBH}`":`"" + $HOSTNAME + "`",`"{#SC}`":`"" + $service.Name + "`"},"

      write-host $line_sc

      }
      }
But it does not work
0
 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
That should work, if $COLSC contains values.
0
 
bibi92Author Commented:
The $COLSC contains values but it does not work
0
 
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
You might want to also echo the result of ($arg1 -match 'DB') with write-host, to make sure the match works. Depending on how values are provided by zabbix, the match might require a wildcard:
   if ($arg1 -match "*DB")
or
   if ($arg1 -match "* DB")
0
 
bibi92Author Commented:
if ($arg -match <<<<  "*DB") {
 + CategoryInfo          : InvalidOperation: (:) [], ParentContainsErrorRecordException
 + FullyQualifiedErrorId : BadOperatorArgument
0
 
bibi92Author Commented:
if ($arg1 -match <<<<  "*DB") {
 + CategoryInfo          : InvalidOperation: (:) [], ParentContainsErrorRecordException
 + FullyQualifiedErrorId : BadOperatorArgument
0
 
bibi92Author Commented:
thanks
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.