簡體   English   中英

PowerShell命令從Batch運行

[英]PowerShell Command run from Batch

我有這個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團隊進行調整,以監控空白區域的增長情況。 我收到的錯誤代碼與您的假設無關,我為不包括它們而道歉。 我得到的錯誤代碼是:表達式或語句中出現意外的標記':N2'。 當我從命令中刪除“: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。 啊....

JOESPH

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 | 選擇$ properties | sort-obj ect name | ConvertTo-Html | Set-Content $ pathToFile - '$ data'不被識別為內部或外部命令,可操作程序或批處理文件。

我可能只是將此數據庫脫機並進行碎片整理以釋放空間。 而不是試圖從這個瘋狂的想法監控它。

我的第一個問題是,你為什么要通過批處理文件來做這件事?

選項1

如果您嘗試通過雙擊文件資源管理器來啟動某些內容,並且您使用的是PowerShell 3.0,則可以使用“使用PowerShell運行”功能(從PowerShell提示符運行Get-Help about_Run_With_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 | 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 List | 設置內容“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 )然后將“Add Arguments”字段設置為: -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

另一種方法是從@ 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) }}

這是@FinalizedFrustrations原始選項#1,插入了Add-PSSnappin。 我假設這些已加載到PS環境中(我不使用Exchange,因此可能需要修改)。

如果要編寫將由此批處理選項執行的多個腳本,他的第二個選項會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM