powershell脚本执行问题


PowerShell交流中心powershell脚本执行问题
0
anker asked 8年 ago

我写好了一个powershell数据库状态监控脚本,能在Exchange Management Shell 窗口下运行,但是我放在windows计划任务里就运行不了,经测试在CMD下指定路径调用脚本提示以下错误:(请大神们帮助)

PS E:\> .\Script_database.psl
无法将“.\Script_database.psl”项识别为 cmdlet、函数、脚本文件或可运行程序的名
称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重试。
所在位置 行:1 字符: 22
+ .\Script_database.psl <<<<
+ CategoryInfo          : ObjectNotFound: (.\Script_database.psl:String) [
], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

3 Answers
1
Mooser Lee 管理员 answered 8年 ago
  1. 请研究Exchange Management Shell控制台的快捷方式,看它在启动时导入了那些脚本库或者模块。
  2. 请在计划任务中配置要执行的程序为PowerShell.exe的全路径
  3. 请在计划任务中配置的执行程序的参数为 -File d:\a\Script_database.psl全路径。(如果需要加载一些必须的模块,也在Script_database.psl加载)
  4. 请确认你的脚本中有没有依赖当前用户的profile,如果有,请更新你的计划任务的运行账号为你自己的账号,比如域账号。
  5. 请确认你的脚本是否有需要提升权限的命令,如果有请在计划任务中配置提升权限。
0
anker answered 8年 ago

  我查看控制台启动有加载这个 -version 2.0 -noexit -command “. ‘C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1’; Connect-ExchangeServer -auto ”  但是在计划任务里配置执行参数为这个时,任务成功执行但还是只打开Powershell 那个窗口,没有调用E:\Script_database.psl 脚本。怎么让它自动调用呢?  

Mooser Lee 管理员 replied 8年 ago

. ‘C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1的意思是加载加载脚本库。你把它写在你的E:\Script_database.psl第一行。Connect-ExchangeServer -auto, 我没有用过但是顾名思义,他是要根据你当前的默认用户账号登陆ExchangeServer,所以我我的答案中的第四点非常重要,需要让计划任务以域账号运行。
Connect-ExchangeServer -auto 写在你的Script_database.psl中的第二行。

Mooser Lee 管理员 replied 8年 ago

你的计划任务重的参数应当为 -version 2.0 -noexit -File E:\Script_database.psl

anker replied 8年 ago

按照您的指导, E:\Script_database.psl 代码修改如:

. ‘C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1’;

Connect-ExchangeServer -auto

$dbs = get-mailboxdatabase

foreach ($db in $dbs)

{

$dbname = $db.name

$shujk = Get-MailboxDatabase -Identity $dbname -status

if ($shujk.mounted -eq $True)

{

$msg = “alert! your $shujk database was dismounted!”

$nSmtpserver = “XXXXXXXXX”

$nFrom = “XXXXXXXXX ”

$nTo = “XXXXXX”

$nSubject = “Database status alert”

send-mailmessage -bodyashtml -subject $nSubject -Smtpserver $nSmtpserver -From $nFrom -To $nTo -body $Msg

}

else

{

# do nothing

}

}

在windows powershell 调用这个脚本还是报错;
PS E:\> .\Script_database.psl
无法将“.\Script_database.psl”项识别为 cmdlet、函数、脚本文件或可运行程序的名
称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重试。
所在位置 行:1 字符: 22
+ .\Script_database.psl <<<<
+ CategoryInfo : ObjectNotFound: (.\Script_database.psl:String) [
], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Mooser Lee 管理员 replied 8年 ago

不要调用 .\Script_database.psl
你直接用全路径就可以了。
D:\Users\mosser\Script_database.psl

anker replied 8年 ago

Windows PowerShell
版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS C:\Users\TEMP> e:\Script_database.psl
无法将“e:\Script_database.psl”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确
保路径正确,然后重试。
所在位置 行:1 字符: 23
+ e:\Script_database.psl <<<<
+ CategoryInfo : ObjectNotFound: (e:\Script_database.psl:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

anker replied 8年 ago

感谢您的指导,我刚是名称打错了,手动输入的没有复制。再次测试已经可以使用了!

Windows PowerShell
版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS C:\Users\TEMP> e:\Script_database.ps1

欢迎使用 Exchange 命令行管理程序!

cmdlet 的完整列表: Get-Command
仅 Exchange cmdlet: Get-ExCommand
与特定字符串匹配的 cmdlet: Help **
获取常规帮助: Help
获取有关 cmdlet 的帮助: Help or -?
显示快速参考指南: QuickRef
Exchange 团队博客: Get-ExBlog
显示命令的完整输出: | Format-List

第 #9 天的提示:

是不是希望查看 cmdlet 的帮助,但是不希望通读页面和 Shell 窗口中的文本页面?只需结合使用 Online 开关和 Get-Help cmdlet 即
可。Online 开关通知 Shell 在默认浏览器中打开联机版本的 cmdlet 帮助主题。请键入:

Get-Help -Online

详细信息: 正在连接到 xxxxxxxxxxx
详细信息: 已连接到 xxxxxxxxxx
PS C:\Users\TEMP>

0
anker answered 8年 ago

日志名称:          Microsoft-Windows-TaskScheduler/Operational
来源:            Microsoft-Windows-TaskScheduler
日期:            2016/5/18 16:01:01
事件 ID:         322
任务类别:          启动请求已被忽略,实例已在运行
级别:            警告
关键字:           
用户:            SYSTEM
计算机:           NF-CAS2.transgd.com.cn
描述:
任务计划程序未启动任务“\Database status alert”,因为相同任务的实例“{fd457497-e186-4a61-a1b8-17de3e6a3a11}”正在运行。
事件 Xml:
<Event xmlns=”http://schemas.microsoft.com/win/2004/08/events/event”&gt;
  <System>
    <Provider Name=”Microsoft-Windows-TaskScheduler” Guid=”{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}” />
    <EventID>322</EventID>
    <Version>0</Version>
    <Level>3</Level>
    <Task>322</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000000</Keywords>
    <TimeCreated SystemTime=”2016-05-18T08:01:01.221766700Z” />
    <EventRecordID>477461</EventRecordID>
    <Correlation ActivityID=”{FD457497-E186-4A61-A1B8-17DE3E6A3A11}” />
    <Execution ProcessID=”856″ ThreadID=”636″ />
    <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>
    <Computer>NF-XXX.transgd.com.cn</Computer>
    <Security UserID=”S-1-5-18″ />
  </System>
  <EventData Name=”NewInstanceIgnored”>
    <Data Name=”TaskName”>\Database status alert</Data>
    <Data Name=”TaskInstanceId”>{FD457497-E186-4A61-A1B8-17DE3E6A3A11}</Data>
  </EventData>
</Event>

Mooser Lee 管理员 replied 8年 ago

请确保你的脚本在执行以后控制台正常退出了,还要确保脚本的执行时间。
比如设定计划任务每10分钟执行一次,结构每次任务执行的脚本需要20分钟,这样肯定是有问题的。