【问题标题】:Powershell - Insert into MySQL database table errors?Powershell - 插入 MySQL 数据库表错误?
【发布时间】:2014-10-22 17:07:37
【问题描述】:

我的这个插入查询没有正确插入,真的很烦人。我将简要说明我尝试了什么以及我真正想要实现的目标。

我的 PS 脚本的作用:

  1. 从数据库表中对每台计算机进行 ping 操作
  2. 如果 ping 成功,则从计算机获取登录用户名
  3. 将以下值插入数据库表:用户名、主机名、在线(真/假)

下面是不断出现的问题。

问题一:如果我使用如下命令:

$username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty 用户名;

它会像这样插入用户名值:SUPER/user1,这没关系,但我想去掉“SUPER/”,在插入之前只保留实际的用户名“user1”。

我尝试使用下面的一个,但它不起作用:

 $username =  Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty -replace '^.*\\'  Username;  

问题 1 中的命令会给我这两个错误:

无法处理参数,因为参数“obj”的值为空。更改 将参数“obj”的值设置为非空值。

Get-WmiObject : RPC 服务器不可用。

如何忽略这两个错误?

我希望有人可以帮助我,因为它真的很烦人。先谢谢大家了。

Powershell 脚本:

foreach($pcname in $workstation_list){

        $command = $connection.CreateCommand();
        $command.Connection  = $connection;
        $command.CommandText = "INSERT INTO workstation_userlogged
                                 (username,hostname,online)
                                 VALUES (@username,@hostname,@status)";

        ### ============================================================= 
        ### values to be assigned as a parameters
        ### =============================================================           
        $workstation = $pcname;                
        $test_ping   = Test-Connection -ComputerName $workstation -Count 1 -ErrorAction SilentlyContinue;
        $status      = [bool](Test-Connection $workstation -Quiet -Count 1 -ErrorAction SilentlyContinue);

        #if status is TRUE get username
       if($test_ping)
        {
            $username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty Username;
            echo $username;
           #echo -replace '^.*\\' $username;         

           #if ping succeeds but no user is logged
           if($username -eq "") 
           {
                $username = "no user logged";  
           } 

        } #end if

        #if ping DOES NOT succeed set username value to NULL and status to FALSE
        elseif(!$test_ping)
        {
            $username = [DBNull]::Value;
        }

       ### ============================================================= 
       ### Assign parameters with appropriate values
       ### ============================================================= 
        $command.Parameters.Add("@username", $username)     |   Out-Null
        $command.Parameters.Add("@hostname", $workstation)  | Out-Null
        $command.Parameters.Add("@status",   $status)       | Out-null
       ### ============================================================= 
       ### Execute command query
       ### ============================================================= 
        try{
            $command.ExecuteNonQuery() | out-null;
            Write-Host "Successfully inserted in Database";
        }
        catch{
            Write-Host "Caught the exception";
            Write-Host "$_";
        }

       ### ============================================================= 
       ### clear parameter values
       ### =============================================================  
         $command.Dispose()
         $workstation = "";
         $username    = "";
         $status      = "";
         $test_ping   = "";
     }#end for each loop 

【问题讨论】:

    标签: mysql powershell powershell-2.0 powershell-ise


    【解决方案1】:

    我看到了两件事。首先,这一行:

    $username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object Username #-ExpandProperty
    

    应该是这样的:

    $username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty Username 
    

    其次,在 SQL 字符串中嵌入用户名变量时,您没有使用任何引号。试试这个。我引用了所有三个值,因为我不知道其他列是什么类型。

    $command.CommandText = "INSERT INTO workstation_userlogged
                                        (username,hostname,online)
                                        VALUES ('$username','$pc_db','$ping_status')";
    

    【讨论】:

    • +1 域部分可以从用户名中删除,如下所示:$Username -replace '^.*\\'
    • 我删除 -ExpandProperty 的原因是因为它一直给我这个错误:无法处理参数,因为参数“obj”的值为空。将参数“obj”的值更改为非空值。
    • @AnsgarWiechers 我尝试这样做,但最后给了我 }?我究竟做错了什么?谢谢。我更新了上面的代码
    • @mario 参数-ExpandProperty 只需要一个参数:您要扩展的属性的名称,因此您必须使用select -Expand property。使用select property -Expand工作。你会得到尾随的},因为你在删除域部分之前没有扩展属性。
    • 获得 $username 后,执行以下操作:`$username=$username -replace '^.*\\' RPC 错误意味着您在访问其中一个 WMI 注册表时遇到问题远程服务器。解决该问题是完全不同的故事。乍一看,您似乎正确地执行了参数操作。
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 2015-12-13
    • 2017-03-08
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多