?
Solved

powershell question about argument

Posted on 2013-05-15
25
Medium Priority
?
372 Views
Last Modified: 2013-05-16
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
0
Comment
Question by:bibi92
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 12
  • 7
  • 3
  • +1
25 Comments
 
LVL 40

Expert Comment

by:Subsun
ID: 39167558
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
 
LVL 22

Expert Comment

by:Haresh Nikumbh
ID: 39167564
0
 
LVL 70

Expert Comment

by:Qlemo
ID: 39167606
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
Is Your AD Toolbox Looking More Like a Toybox?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 22

Expert Comment

by:Haresh Nikumbh
ID: 39167631
Thanks I  will keep in mind next time.
0
 

Author Comment

by:bibi92
ID: 39167760

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
 
LVL 40

Expert Comment

by:Subsun
ID: 39167862
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
 

Author Comment

by:bibi92
ID: 39167927
Yes, it's already done. I have forgotten to copy this line on the post. Thanks
0
 
LVL 40

Expert Comment

by:Subsun
ID: 39167953
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
 

Author Comment

by:bibi92
ID: 39169839
$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
 

Author Comment

by:bibi92
ID: 39169844
I have to execute .\script.ps1 TEST,DB
0
 
LVL 70

Expert Comment

by:Qlemo
ID: 39170527
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
 

Author Comment

by:bibi92
ID: 39170546
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
 

Author Comment

by:bibi92
ID: 39170587
$args = $arg1 -join ','

If I add echo $args, the result is TEST
0
 
LVL 70

Expert Comment

by:Qlemo
ID: 39170600
Sorry, there is a space where it isn't allowed. Use   [String[]]   instead of   [String []]  .
0
 

Author Comment

by:bibi92
ID: 39171018
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
 
LVL 70

Expert Comment

by:Qlemo
ID: 39171118
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
 

Author Comment

by:bibi92
ID: 39171179
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
 
LVL 70

Expert Comment

by:Qlemo
ID: 39171263
That should work, if $COLSC contains values.
0
 

Author Comment

by:bibi92
ID: 39171408
The $COLSC contains values but it does not work
0
 
LVL 70

Expert Comment

by:Qlemo
ID: 39171469
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
 

Author Comment

by:bibi92
ID: 39171526
if ($arg -match <<<<  "*DB") {
 + CategoryInfo          : InvalidOperation: (:) [], ParentContainsErrorRecordException
 + FullyQualifiedErrorId : BadOperatorArgument
0
 

Author Comment

by:bibi92
ID: 39171528
if ($arg1 -match <<<<  "*DB") {
 + CategoryInfo          : InvalidOperation: (:) [], ParentContainsErrorRecordException
 + FullyQualifiedErrorId : BadOperatorArgument
0
 
LVL 70

Accepted Solution

by:
Qlemo earned 2000 total points
ID: 39171802
Doh! I mixed up -like and -match - either use
   if ($arg1 -like "*DB")
or
  if ($arg1 -match ".*DB")
0
 

Author Closing Comment

by:bibi92
ID: 39173232
thanks
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A procedure for exporting installed hotfix details of remote computers using powershell
Windows 10 came with  a lot of built in applications, Some organisations leave them there, some will control them using GPO's. This Article is useful for those who do not want to have any applications in their image (example:me).
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question