0

各 Exchange データベースで空白を見つけるためにこの powershell コマンドを使用していますが、バッチ経由で実行することはできません。

動作確認済みのシェルコマンドは次のとおりです。

 
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;

シェル コマンドの文字がバッチと連携していないと考えており"^"、失敗するところを試してみました。どんな助けでも大歓迎です。私はバッチとパワーシェルの両方にかなり慣れていないので、小さな言葉を使ってください:)

新しい情報: こんにちは、ご協力ありがとうございます。なぜ私がバッチでこれをやろうとしているのかという最初の質問に答えるのは、これが私が達成しようとしているステップの 1 つに過ぎないからです。この PowerShell コマンドを .txt ドキュメントに出力して、それに対して FOR ループを実行し、パラメータを html ファイルに書き込んで、IT チームに毎日ブラットしてホワイトスペースの成長を監視できるようにします。また、私が受け取っているエラー コードは、あなたの推測とは関係がなく、含めなかったことをお詫びします。エラー コードは次のとおりです。式またはステートメント内の予期しないトークン ':N2'。コマンドから「:N2」を削除すると、「GB」について不平を言い、最後に「GB」を削除すると、「DataBaseSize」という用語について不平を言います。だから私はここ数時間であなたの解決策を試してみます.

新しいエラー:

Bevels の提案を使用して実行すると、次のエラーが表示されます。

C:\temp2>Whitespace.bat 「get-mailboxdatabase」という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから再試行してください。

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 = Get-mailboxdatabase -status | $プロパティを選択 | ソートオブジェクト名 | ConvertTo-Html | Set-Content $pathToFile - '$data' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されません。

このデータベースをオフラインにし、デフラグを実行してスペースを解放するだけです。このクレイジーなアイデアから監視しようとする代わりに。

4

2 に答える 2

2

最初の質問は、なぜバッチ ファイルを使用してこれを実行しようとしているのかということです。

オプション1

ファイル エクスプローラーからダブルクリックで起動できるものを取得しようとしていて、PowerShell 3.0 を使用している場合は、「PowerShell で実行」機能 ( Get-Help about_Run_With_PowerShellPowerShell プロンプトから実行) を使用できます。拡張子が .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"

Get-Help about_PSSessions基本的に、Exchange リモート セッション (および) をセットアップし、Get-Help about_RemoteExchange 管理シェルと同じ方法で接続してから、確立された環境で提供されたスクリプトを呼び出します。

次のステップでは、バッチ ファイルと 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 | ConvertTo-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 を使用していないため、変更が必要になる場合があります)。

このバッチ オプションによって実行される複数のスクリプトを作成する場合は、2 番目のオプションの方が適しています。

于 2013-11-13T04:45:26.940 に答える