使用PowerShell处理net use错误消息

时间:2016-09-01 13:06:04

标签: powershell

我正在使用简单的net use命令来映射网络驱动器

net use \\$HOSTIP $PASSWD /user:$UNAME

我必须使用net use而不是New-PSDrive,因为脚本在多个实例中运行超过400台机器而且不可行。 我想过滤错误消息然后net use return like

System error 64 has occurred.

System error 67 has occurred.

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

#set process startup info (redirect stderr)
$pinfo = new-object System.Diagnostics.ProcessStartInfo
$pinfo.Filename = "net.exe"
$pinfo.UseShellExecute = $false
$pinfo.Arguments = @("use","\\$($HOSTIP)","$($PASSWD)","/user:$($UNAME)")
$pinfo.redirectstandardError = $true
#start process and wait for it to exit
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.start() | out-null
$p.waitforexit()
#check the returncode
if($p.exitcode -ne 0){
    #rc != 0 so we grab the stderr output
    $err = $p.standardError.ReadToEnd()
    #first line of the output contains the string from your question, matching it against regex
    if($err[0] -match "System error ([0-9]*) has occurred"){
        #switching the error code
        switch($Matches[1]){
            64 {do-something64;break;}
            67 {do-something67;break;}
        }
    }
}

这应该可以解决问题,虽然我不能说出它是多么高效,但你必须尝试。如果输出可能与您在问题中发布的字符串不同,则必须编写自己的正则表达式来处理它们。

请记住,net的输出已本地化,因此我的示例中的正则表达式不适用于系统语言不是英语的系统。

希望有所帮助

答案 1 :(得分:0)

使用cmdstderr重定向到stdout

$log = cmd /c "2>&1" net use \\$HOSTIP $PASSWD /user:$UNAME

现在变量包含一个字符串数组(2个带文本,2个空):

  

发生了系统错误53。

     

找不到网络路径。

你可以解析它:

$log = cmd /c "2>&1" net use \\$HOSTIP $PASSWD /user:$UNAME
if ($LASTEXITCODE -and $log -join "`n" -match '^.+?(\d+).+?\n+(.+)') {
    $errCode = [int]$matches[1]
    $errMessage = $matches[2]
}