PowerShell Command запускается из пакета

У меня есть команда powershell, чтобы найти пробелы в каждой из моих баз данных Exchange, однако я не могу заставить ее работать через пакет.

Вот команда оболочки, подтвердившая свою работоспособность:

 
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;

Я думаю, что символы в команде оболочки не взаимодействуют с пакетом и пытались "^" их там, где они терпят неудачу. Любая помощь будет оценена. Я довольно новичок в пакетном и PowerShell, поэтому, пожалуйста, используйте маленькие слова:)

НОВАЯ ИНФОРМАЦИЯ: Привет, спасибо за вашу помощь. Чтобы ответить на ваш первый вопрос о том, почему я пытаюсь сделать это с помощью пакета, это потому, что это лишь один из шагов, которые я пытаюсь выполнить. Я хочу, чтобы эта команда powershell выводила в документ.txt, чтобы я мог затем запустить цикл FOR для него и записать параметры в html-файл, который затем будет ежедневно обрабатываться моей ИТ-командой для отслеживания роста на пустом месте. Также коды ошибок, которые я получаю, не связаны с вашими предположениями, и я прошу прощения за то, что не включил их. Я получаю код ошибки: Неожиданный токен ':N2' в выражении или выражении. Когда я удаляю ":N2" из команды, он жалуется на "ГБ", и, наконец, когда я удаляю "ГБ", он жалуется на термин "DataBaseSize". Поэтому я буду пробовать ваши решения здесь в ближайшие несколько часов, я просто хотел поблагодарить вас и сообщить вам об ошибках, которые я вижу.

НОВЫЕ ОШИБКИ:

После того, как я запускаю его, используя предложение Beavels, я получаю следующие ошибки:

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. Уф....

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> "имя" "имя" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. "{Имя" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. "{Имя" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. "{Имя" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

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" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

Я могу просто отключить эту базу данных и выполнить дефрагментацию, чтобы освободить место. Вместо того, чтобы пытаться контролировать это из этой безумной идеи.

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_PSSessions а также Get-Help about_Remote) и подключаемся так же, как это делает командная консоль Exchange, тогда мы вызываем скрипт, который вы предоставляете в установленной среде.

На следующем этапе я предполагаю, что ваш командный файл и скрипт PS находятся в одном каталоге, который является вашим текущим каталогом в командной строке open, и запустите .\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 | Set-Content "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 Список | Set-Content "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

Альтернатива - взять вариант 1 из ответа @FinalizedFrustration и просто заставить командный файл выполнить сценарий, содержащий все команды, например так:

@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, поэтому, возможно, потребуется изменить).

Его второй вариант работает лучше, если вы хотите написать несколько сценариев, которые будут выполняться с помощью этого пакетного параметра.

Другие вопросы по тегам