0

我有这个 powershell 命令来查找我的每个 Exchange 数据库中的空格,但是我无法让它通过批处理运行。

这是确认工作的shell命令:

 
get-mailboxdatabase -status | 
  select name, 
     @{Name="DataBaseSize";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes()) / 1gb) }},
     @{Name="AvailableNewMailboxSpace";Expression={ "{0:N2} GB" -f(($_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }},
     @{Name="Difference";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes() - $_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}

这是运行 Shell 命令的批处理:


C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command ". 'D:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto;

我认为 shell 命令中的字符不与批处理合作,并"^"在失败的地方尝试了它们。任何帮助,将不胜感激。我对批处理和powershell都很陌生,所以请用小词:)

新信息:您好,感谢您的帮助。要回答你的第一个问题,即我为什么要尝试批量执行此操作,因为这只是我要完成的步骤之一。我希望这个 powershell 命令输出到一个 .txt 文档,这样我就可以对它运行一个 FOR 循环并将参数写入一个 html 文件,然后每天将它发送给我的 IT 团队以监控空白的增长。此外,我收到的错误代码与您的假设无关,我很抱歉没有包括它们。我得到的错误代码是:Unexpected token ':N2' in expression or statement。当我从命令中删除“:N2”时,它会抱怨“GB”,最后当我删除“GB”时,它会抱怨“DataBaseSize”一词。所以我会在接下来的几个小时里在这里尝试你的解决方案,

新错误:

使用 Beavels 建议运行它后,我收到以下错误:

C:\temp2>Whitespace.bat 术语“get-mailboxdatabase”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

At C:\temp2\Whitespace.ps1:1 char:20

+ get-mailboxdatabase <<<<  -status |select name, @{Name="DataBaseSize";Express
ion={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes()) / 1gb) }}, @{Name="AvailableN
ewMailboxSpace";Expression={ "{0:N2} GB" -f(($_.AvailableNewMailboxSpace.ToByte
s()) / 1gb) }}, @{Name="Difference";Expression={ "{0:N2} GB" -f (($_.DatabaseSi
ze.ToBytes() - $_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}
+ CategoryInfo          : ObjectNotFound: (get-mailboxdatabase:String) [],
CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

它抱怨 get-mailboxedatabase 这个术语,但这是一个 CDMLET。啊....

约瑟夫

C:\temp2>。'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps 1' '。不被识别为内部或外部命令、可运行程序或批处理文件。

C:\temp2>Connect-ExchangeServer -auto 'Connect-ExchangeServer' 不是内部或外部命令、可运行程序或批处理文件。

C:\temp2>$properties = @( '$properties' 不是内部或外部命令、可运行程序或批处理文件。

C:\temp2>"name" '"name"' 不是内部或外部命令、可运行程序或批处理文件。'{Name' 不是内部或外部命令、可运行程序或批处理文件。'{Name' 不是内部或外部命令、可运行程序或批处理文件。'{Name' 不是内部或外部命令、可运行程序或批处理文件。

C:\temp2># 您可能希望将此文件放在文件服务器上的某个位置 '#' 未被识别为内部或外部命令、可运行程序或批处理文件。

C:\temp2>$pathToFile = "\server\share\Some\Path\To\File.html" '$pathToFile' 不是内部或外部命令、可运行程序或批处理文件。

C:\temp2>$data = 获取邮箱数据库 -status | 选择 $properties | 排序对象名称 | 转换为 Html | Set-Content $pathToFile - '$data' 不是内部或外部命令、可运行程序或批处理文件。

我可能会将此数据库脱机并进行碎片整理以释放空间。而不是试图从这个疯狂的想法中监控它。

4

2 回答 2

2

我的第一个问题是,你为什么要通过批处理文件来做到这一点?

选项1

如果您尝试从文件资源管理器中通过双击启动某些内容,并且您使用的是 PowerShell 3.0,则可以使用“使用 PowerShell 运行”功能(Get-Help about_Run_With_PowerShell从 PowerShell 提示符运行)。只需创建一个扩展名为 .ps1 的文件并设置如下内容:

. 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1';
Connect-ExchangeServer -auto;
get-mailboxdatabase -status | select name, @{Name="DataBaseSize";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes()) / 1gb) }},@{Name="AvailableNewMailboxSpace";Expression={ "{0:N2} GB" -f (($_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }},@{Name="Difference";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes() - $_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}

然后只需右键单击该文件并选择“使用 PowerShell 运行”

选项 2

如果您试图让某个不喜欢或不理解 PowerShell 的软件/系统运行 powershell 脚本或命令。

现在,没有实际的错误消息或要检查的输出,我必须开始做出一些假设。

当您运行批处理脚本时,是否会收到如下错误:

. : File C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1
cannot be loaded because running scripts is disabled on this system. For more
information, see about_Execution_Policies at
http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:3
+ . 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1';
Conne ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
Connect-ExchangeServer : The term 'Connect-ExchangeServer' is not recognized
as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:76
+ . 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1';
Conne ...
+
~~~~~
    + CategoryInfo          : ObjectNotFound: (Connect-ExchangeServer:String)
   [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

如果是这样,那么我们在执行策略方面确实存在一些问题。有关这方面的更多信息,请使用Get-Help about_Execution_Policies或转到有关执行策略的 MS Technet 页面。

我个人的偏好是将本地机器范围设置为 RemoteSigned 执行策略,但这只是我。

现在,除非您提供的批处理文件的内容中缺少某些内容,否则它看起来与随 Exchange 管理工具一起安装的 Exchange 命令行管理程序快捷方式的目标字段几乎相同。你是如何传递 PowerShell 命令的?您是将其作为命令行参数提供给批处理文件,还是作为硬编码在批处理文件中的参数的一部分?我的建议是按照 foxdrive 的建议去做,或者做一些更像这样的事情:

为您需要的任何命令创建一个 powershell 脚本。让我们调用它MdbWhitespace.ps1并将内容设置为您的命令。

创建您的批处理文件。让我们调用它RunExchPs.bat并将内容设置为

@echo off
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; %1"

基本上,我们设置 Exchange 远程会话 (Get-Help about_PSSessionsGet-Help about_Remote) 并以与 Exchange 命令行管理程序相同的方式连接,然后我们调用您在已建立环境中提供的脚本。

我假设下一步你的批处理文件和 PS 脚本在同一个目录中,这是你在打开的命令提示符下的当前目录,然后运行.\RunExchPs.bat .\MdbWhitepace.ps1​​.

只要您的执行策略设置正确以允许脚本运行,这将完美运行。如果您不能或不想永久更改执行策略,则可以设置批处理文件以针对该会话进行更改:

@echo off
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command "Set-ExecutionPolicy Bypass Process -Force; . 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; %1"

希望这可以帮助。

回应评论的编辑

对于我在评论中提到的 ConvertTo-Html,

你可以做

$dataFromCommand | 转换为 Html | 设置内容“PathTo\File.html”

这为您提供了类似的输出(作为 HTML 表):

Name    DataBaseSize    AvailableNewMailboxSpace    Difference
A - B       60.88 GB        4.88 GB                         56.00 GB
C - Dk      81.51 GB        6.78 GB                         74.73 GB

或者你可以得到一个列表:

$dataFromCommand | ConvertTo-Html -As 列表 | 设置内容“PathTo\File.html”

这使:

Name:                       A - B
DataBaseSize:               60.88 GB
AvailableNewMailboxSpace:   4.88 GB
Difference:                 56.00 GB
___________________________________
Name:                       C - Dk
DataBaseSize:               81.51 GB
AvailableNewMailboxSpace:   6.78 GB
Difference:                 74.73 GB

如果你想让它成为你可以设置和忘记的东西,

制作一个包含以下内容的脚本文件:

. 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'
Connect-ExchangeServer -auto
$properties = @(
    "name"
    @{Name="DataBaseSize";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes()) / 1gb) }}
    @{Name="AvailableNewMailboxSpace";Expression={ "{0:N2} GB" -f(($_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}
    @{Name="Difference";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes() - $_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}
)
# you might want to put this file on a file server somewhere
$pathToFile = "\\server\share\Some\Path\To\File.html"
$data = Get-mailboxdatabase -status | select $properties | sort-object name | ConvertTo-Html | Set-Content $pathToFile -Force

然后从计划任务运行脚本(如果您使用的是 PowerShell 2.0)对于计划任务操作,启动一个程序,将程序指向 Powershell 可执行文件(通常C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe),然后将“添加参数”字段设置为:-NoLogo -NonInteractive R:\Full\Path\To\Script\script.ps1

添加您想要的任何触发器,并自动维护 html 文件以供您的人员监控。

如果您可以使用 PowerShell 3.0 或更高版本,则可以从任何 PowerShell 提示符执行以下操作:

$trigger = New-JobTrigger -Daily -At 8:00AM
Register-ScheduledJob -Credential (Get-Credential) -FilePath "R:\Full\Path\To\script.ps1" -Name "Exchange MDB Size Stats" -Trigger $trigger
于 2013-11-13T02:10:29.343 回答
0

另一种方法是从@FinalizedFrustration 的响应中获取选项 1,并让批处理文件执行包含所有命令的脚本,如下所示:

@echo off
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command "Set-ExecutionPolicy Bypass Process -Force; & C:\<path-to-script>\MdbWhitespace.ps1"

假设 MdbWhitespace.ps1 看起来像:

. 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1';
Connect-ExchangeServer -auto;
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -EA SilentlyContinue
get-mailboxdatabase -status | select name, @{Name="DataBaseSize";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes()) / 1gb) }},@{Name="AvailableNewMailboxSpace";Expression={ "{0:N2} GB" -f (($_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }},@{Name="Difference";Expression={ "{0:N2} GB" -f (($_.DatabaseSize.ToBytes() - $_.AvailableNewMailboxSpace.ToBytes()) / 1gb) }}

这是插入了 Add-PSSnappin 的 @FinalizedFrustrations 原始选项 #1。我假设这些已加载到 PS 环境中(我不使用 Exchange,因此可能需要修改)。

如果您想编写多个将由此批处理选项执行的脚本,他的第二个选项效果更好。

于 2013-11-13T04:45:26.940 回答