我有一个脚本(我们称之为myPSScript.ps1),它采用两个参数并执行预定义的步骤.脚本位于Windows Server框中,人们登录并执行脚本.支持两个用户在给定时间登录.
我想找出谁调用了脚本.
(Get-WmiObject -Class Win32_Process | Where-Object {$_.ProcessName -eq 'explorer.exe'}).GetOwner() | Format-Table Domain, User
Run Code Online (Sandbox Code Playgroud)
当用户当前登录并尝试运行脚本时,此方法有效.但是如果我在计划任务中有一个批处理文件并运行相同的脚本呢?
在这种情况下,同一个命令返回一个空异常,因为没有人登录到该机器.
有没有办法找出谁/哪个进程调用了powershell脚本.我依稀记得Start-Transcript记录从哪个用户运行命令,所以这应该是可能的?
谢谢!Sanjeev
我正在从MSBuild调用PowerShell脚本.MSBuild能够捕获返回的输出,但认为项目已成功构建.
问题是PowerShell的退出代码没有传递给MSBuild中的命令.有人曾经试过这个并且能够向MSBuild抛出退出代码吗?
testmsbuild.proj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ScriptLocation>c:\scripts\test.ps1</ScriptLocation>
</PropertyGroup>
<Target Name="AfterDropBuild" >
<Exec Command="powershell.exe -NoProfile -Noninteractive -command "& { $(ScriptLocation)%3Bexit $LASTEXITCODE }" " >
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
test.ps1(当然这会出错)
function CallFromMSBuild {
Invoke-command {Powershell.exe C:\a.ps1} -computername $computers
}
Run Code Online (Sandbox Code Playgroud)
当触发MSBuild项目时,它应该已经发现问题并且构建应该失败(认为构建成功了)
当我从MSBuild打电话时
C:\Scripts>msbuild testmsbuild.proj /t:AfterDropBuild
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.225]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 4/28/2011 2:46:29 PM.
Project "C:\scripts\testmsbuild.proj" on node 1 (AfterDropBuild target(s)).
AfterDropBuild: …Run Code Online (Sandbox Code Playgroud)