How to escape curly brackets in powershell - powershell

I have this
$content = "loose text{{comments}} = {{yolo}}{{comments}} = {{yolo2}}{{comment}} = {{yolo3}}{{comment}} = {{yolo4}}loose text2";
and I want to escape the brackets. I read somewhere that to escape it, you double them, but even then it is not working.
I get
Cannot convert value "loose text{{comments}} = {{yolo}}{{comments}} = {{yolo2}}{{comment}} = {{yolo3}}{{comment}} = {{yolo4}}loose text2" to type "System.Xml.XmlDocument". Error: "The specified node cannot be inserted as the valid child of this node,
because the specified node is the wrong type."
At line:1 char:1
+ $content = "loose text{{comments}} = {{yolo}}{{comments}} = {{yolo2}}{{comment}} ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException

The escape character in PS is the "back-tic" = `. However, in the code presented you should not have any issue just having the {} in your string.
In any case that you need to escape it just use a the sample below:
$content = "loose text`{comments`} = `{yolo`}`{comments`} = `{yolo2`}`{comment`} = `{yolo3`}`{comment`} = `{yolo4`}loose text2"

Related

Override Creation for Monitors and Rules

I want to create PowerShell scripts to override some parameter of my monitor and rule. I used the below code, but I have some errors. I want override my overidable parameter not enabled or something else. How can I doe this?
$mps = Get-SCOMManagementPack | ? {$_.Name -like "test"}
$overrideMp = Get-SCOMManagementPack -DisplayName "Overrides"
$overridename = "testmonitor.Overrides"
$monitor = 'testmonitor'
$override = New-Object Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitorPropertyOverride($overrideMp,$overridename)
$override.Monitor = $monitor
$override.Property = 'WarningThreshold'
$override.Value = 80
$override.DisplayName = "Overrides"
$overrideMp.Verify()
$overrideMp.AcceptChanges()
Errors:
error1: Exception setting "Property": "Cannot convert value "WarningThreshold" to
type "Microsoft.EnterpriseManagement.Configuration.ManagementPackMonitorProperty".
Error: "Unable to match the identifier name WarningThreshold to a valid enumerator
name. Specify one of the following enumerator names and try again: Enabled,
TraceEnabled, Algorithm, AlgorithmPercentage, DefaultState, GenerateAlert,
AutoResolve, AlertPriority, AlertOnState, AlertSeverity, AlertMessage,
AlertParameter1, AlertParameter2, AlertParameter3, AlertParameter4,
AlertParameter5, AlertParameter6, AlertParameter7, AlertParameter8,
AlertParameter9, AlertParameter10, MemberInMaintenance, MemberUnavailable,
IgnoreMemberInMaintenance, IgnoreMemberUnavailable""
At line:1 char:2
+ $override.Property = $parametername
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
error2 : Exception calling "AcceptChanges" with "0" argument(s): "Database error.
MPInfra_p_ManagementPackInstall failed with exception: Failed to validate item:
testrule1"
At line:193 char:1
+ $MP.AcceptChanges()
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ManagementPackException
The error message looks rather clear to me. There is no property WarningThreshold in the ManagementPackMonitorProperty enumeration. I don't have much experience with SCOM, but you probably need to override the property AlertOnState for monitors where the property AlertSeverity has the value Warning.
Try something along the lines of this:
$mps | Get-SCOMMonitor | Where-Object {
# (other selection criteria) -and
$_.AlertSettings.AlertSeverity -eq 'Warning'
} | ForEach-Object {
$ctx = Get-SCOMClass -Id $_.Target.Id
# ...
$override = New-Object ...
$override.Monitor = $_
$override.Property = 'AlertOnState'
$override.Value = 80
$override.Context = $ctx
# ...
}
Code adopted from here (probably the same place where you found it). Not sure if this works, though. Like I said, I have very little experience with SCOM, and I don't have a SCOM server available for testing.
I'll try to debug it tomorrow in the office.
BTW, there is a third-party tool for override management called MPTuner: http://mpwiki.viacode.com/default.aspx?g=mptuner
It's free so you should try.
Roman.
It's quite confusing, but there are two different type of overrides for each workflow type. For a monitor there are:
MonitorPropertyOverride
MonitorConfigurationOverride
You are using the first one, wgich is for standard parameters only, like Enabled, for example. For any custom parameters use Configuration Override.

Why Error "System.String does not contain a method named 'AppendChild'"

Why does this PowerShell Script not work:
[xml]$xml = '<products></products>'
$newproduct = $xml.CreateElement('product')
$attr = $xml.CreateAttribute('code')
$attr.Value = 'id1'
$newproduct.Attributes.Append($attr)
$products = $xml.products
$products.AppendChild($newproduct)
Error is
Method invocation failed because [System.String] does not contain a method named 'AppendChild'.
At line:1 char:1
+ $products.AppendChild($newproduct)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
If I replace
$products = $xml.products
by
$products = $xml.SelectSingleNode('//products')
it will work, but I'd like to know why first syntax does not work because it is illogical for me. $xml.products should be a valid XML object and thus provide the method AppendChild().
$xml.products does not reference the products node itself, but the contents of the products node. Since products is empty, it evaluates to an empty string.
To get to the products node you could also use:
$Products = $xml.FirstChild
$Products.AppendChild($newproduct)
or, more specifically:
$Products = $xml.ChildNodes.Where({$_.Name -eq "products"}) |Select-Object -First 1
$Products.AppendChild($newproduct)
But SelectSingleNode() will probably serve you just fine
$xml.configuration.SelectSingleNode("connectionStrings").AppendChild($newnode)
would work fine, but an interesting & dirty hack: given this empty node:
<connectionStrings>
</connectionStrings>
the script
$xml.configuration.connectionStrings.AppendChild($newnode)
gives a "Method invocation failed because [System.String] does not contain a method named 'AppendChild'" error
but this:
<connectionStrings>
<!-- random comment -->
</connectionStrings>
works perfectly fine

PowerShell and VB6 COM+ modules: Object variable or With block variable not set

I´m trying to use powershell to do automatic tests in my system, but 30% of this system is VB6 modules used thru COM. Some os these modules uses private variables that are globals inside the module. With VB6 functions that don´t use these variables, everything works fine, but with the functions that rely on these "private globals", I´m getting the error "Object variable or With block variable not set". Unfortunately, migrate this VB6 code will not occur in short term.
This is a piece of this legacy code:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 1 'NoTransaction
END
Attribute VB_Name = "Data"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
Option Explicit
Private oConn As ADODB.Connection
Private oRs As ADODB.Recordset
Public Function rsOperadora(ByVal sUser As String, _
ByVal sPassword As String, _
ByVal sIP As String, _
ByVal sSystem As String, _
ByVal sModule As String)
Dim sSql As String
sSql = "select * from operator"
Call Connect(sUser, sPassword, sSystem, sModule, sIP)
oRs.CursorType = adOpenStatic
oRs.CursorLocation = adUseClient
oRs.Open sSql, oConn, , adLockBatchOptimistic
oRs.ActiveConnection = Nothing
Set rsOperadora = oRs
Set oConn = Nothing
End Function
What I tried to do:
PS E:\aazevedo> $tsdb = New-Object -ComObject "TSDB.Data"
PS E:\aazevedo> $tsdb.rsOperadora
OverloadDefinitions
-------------------
Variant rsOperadora (string, string, string, string, string)
PS E:\aazevedo> $tsdb.rsOperadora("ADMIN","8482867D8B958F0E","","DESENV11","")
Exception calling "rsOperadora" with "5" argument(s): "Object variable or With block variable not set"
At line:1 char:1
+ $tsdb.rsOperadora("ADMIN","8482867D8B958F0E","","DESENV11","")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
PS E:\aazevedo> $oRs = New-Object -ComObject "ADODB.Recordset"
PS E:\aazevedo> $tsdb.rsOperadora("ADMIN","8482867D8B958F0E","","DESENV11","")
Exception calling "rsOperadora" with "5" argument(s): "Object variable or With block variable not set"
At line:1 char:1
+ $tsdb.rsOperadora("ADMIN","8482867D8B958F0E","","DESENV11","")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
PS E:\aazevedo> oRs = New-Object -ComObject "ADODB.Recordset"
oRs : The term 'oRs' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ oRs = New-Object -ComObject "ADODB.Recordset"
+ ~~~
+ CategoryInfo : ObjectNotFound: (oRs:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
In this example, the function Connect open a database connection using ADO, assigning to the variable oConn.
I think my problem is the variable oRs.
Inside ASP Classic this module works.
PS: sorry for my poor english.

Multiple parameter in powershell

I have a powershell script to call the SP which is shown below
$sqlTableConnection = New-Object [System.Data.SqlClient.SqlConnection]("Server=1xx.xx.xxx; Database=dbName; Integrated Security= True");
$sqlTableCmd = New-Object [System.Data.SqlClient.SqlCommand]
$sqlTableCmd.CommandText = "[System_Control].[usp_Check_system]"
$sqlTableCmd.Connection = $sqlTableConnection;
$jobName1 = "MASTER_JOB";
$sqlTableCmd.Parameters.AddWithValue("#JobName", $jobName1) ;
$outParameter = new-object System.Data.SqlClient.SqlParameter;
$outParameter.ParameterName = "#JobSatatus";
$outParameter.Direction = [System.Data.ParameterDirection]'Output';
$outParameter.DbType = [System.Data.DbType]'Boolean';
$sqlTableCmd.Parameters.Add($outParameter) ;
$sqlTableCmd.Connection = $sqlTableConnection
$sqlTableConnection.Open();
$sqlTableCmd.ExecuteNonQuery();
$truth = $sqlTableCmd.Parameters["#JobSatatus"].Value;
$sqlTableConnection.Close();
$truth;
but when I am running this I am getting below error
Exception calling "ExecuteNonQuery" with "0" argument(s): "The variable name '#
JobName' has already been declared. Variable names must be unique within a quer
y batch or stored procedure."
At line:15 char:33
+ $sqlTableCmd.ExecuteNonQuery <<<< ();
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Where I am doing mistake?
You should only be getting that error if you aren't re-initializing the SqlCommand object and so it has #JobName already defined.
I suspect you are getting this when you run it manually, not when you execute the script as a whole..
OR, if you are seeing it all the time, then maybe you moved this code into a function but the original $sqlTableCmd was initialized in the main code and now when this executes, it is in a different scope, but is getting confused by the one that was defined in the higher scope?
As I understand it, this line here is the one that should be setting things up fresh for you:
$sqlTableCmd = New-Object [System.Data.SqlClient.SqlCommand]

Call to EnvDTE.TextSelection.FindPattern from PowerShell fails with type mismatch

I'm building a custom scaffolder to use with MvcScaffolding. Trying to automate adding code to the beginning of a method, I came up with the following code:
$codeElement = Get-ProjectType "MyType"
foreach ($member in $codeElement.Members)
{
if ($member.Name -eq "CreateMappings")
{
$editPoint = $member.StartPoint.CreateEditPoint()
# here's where it's crashing
$editPoint.FindPattern("\{")
$editPoint.Insert("text")
}
}
When I run my custom scaffolder, FindPattern fails with
Exception calling "FindPattern" with "1" argument(s): "Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"
At Path\File.ps1:62 char:26
+ $editPoint.FindPattern <<<< ("\{")
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
As opposed to this macro, which runs just fine:
Sub macro()
Dim objTD As TextDocument = DTE.ActiveDocument.Object("TextDocument")
Dim editPoint As EditPoint = objTD.StartPoint.CreateEditPoint()
If (editPoint.FindPattern("\{", vsFindOptions.vsFindOptionsRegularExpression)) Then
editPoint.CharRight()
editPoint.Insert("text")
End If
End Sub
What am I doing wrong?