我正在使用简单的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.
我该怎么做?
答案 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)
使用cmd
将stderr
重定向到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]
}