Как создать базовый скрипт PowerShell для запуска простых команд и вывода результатов на терминал? - PullRequest
1 голос
/ 01 июня 2019

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

Я новичок в PowerShell и знаю, как мне поступить в среде GNU / Linux, но не Windows.

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

Set-Location D:\Path\To\Directory
findstr /S "MachineName" app_*.log
Get-Date
Write-host

Я ожидал, что он покажет вывод, как если быЯ набрал его вручную, но не получил этого результата.

Кто-нибудь может протянуть руку?

1 Ответ

0 голосов
/ 02 июня 2019

По умолчанию открытие (двойной щелчок) *.ps1 файлов в проводнике файлов / на рабочем столе открывает их для редактирования , а не запускает их, что включает ярлыки файлов этой точки до *.ps1 файлов.

Как вы заявляете, вы используете (предварительно установленную) Run in PowerShell команду контекстного меню для явного запуска ваших сценариев.

Эта команда вызывает PowerShell без -NoExit, что означает, что PowerShell открывает новое окно консоли, выполняет файл сценария и затем выходит из сеанса, тем самым автоматически закрытие окна - то есть вы не увидите вывод скрипта после его выхода.

У вас есть три основных варианта:

(a) Чтобы решить проблему для всех сценариев (и файлов ярлыков, указывающих на них), переопределите пользовательскую команду, чтобы оставить сеанс PowerShell открытым с -NoExit, что означает, что окно всегда остается открытым после завершения выполнения скрипта - см. ниже.

(b) Для заданного сценария (и файла ярлыка, указывающего на него) измените его так, чтобы в конце команда Read-Host оставалась открытой для сеанса до пользователь нажимает Enter; например, Read-Host "Press Enter to exit" - обратите внимание, что, хотя это позволяет вам проверять вывод сценария, вы не сможете поддерживать сеанс таким образом; все, что вы делаете, это откладываете закрытие окна.

(c) Для заданного файла ярлыка , указывающего на файл *.ps1, измените свойства файла ярлыка, заменив поле Target: в диалоговом окне «Свойства» для явного вызова PowerShell с -NoExit; например, если поле Target: содержит c:\scripts\foo.ps1, замените его на
powershell.exe -NoExit -File "c:\scripts\foo.ps1".


Обновление команды контекстного меню Run in PowerShell, чтобы поддержать сеанс после выполнения скрипта.


Важно : Команда Run in PowerShell может быть недоступной в некоторых версиях Windows 10. Например, на моем компьютере под управлением Windows 10, версия 1803, Приведенная ниже методика не работает: хотя определение команды все еще присутствует в реестре на HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0, File Explorer, по-видимому, игнорирует определения там. Если кто-то знает почему, пожалуйста, сообщите нам. Неоптимальным обходным решением является определение команды для всех типов файлов; то есть цель 'HKCU:Software\Classes\*\Shell\Run in PowerShell\command'.


Выполните следующую команду, которая обновляет стандартную команду Run in PowerShell context-menu для файлов *.ps1, чтобы выполнить их в новом сеансе PowerShell, который остается открытым после завершения сценария.
Обратите внимание, что областью обновления является текущая учетная запись пользователя (HKCU: == HKEY_CURRENT_USER); Вместо этого вы можете использовать HKLM: (HKEY_LOCAL_MACHINE), чтобы внести изменения для всех пользователей, но для этого требуется запуск с правами администратора.

$null = New-Item -Force -Path 'HKCU:Software\Classes\Microsoft.PowerShellScript.1\Shell\0\command' |
  New-ItemProperty -Force -Name '(default)' -Value "$PSHOME\powershell.exe -NoExit -File `"%1`""

Примечание:

  • Как и в оригинальной команде, ваш $PROFILE файл все еще загружен - вы можете отменить это, поместив
    -NoProfile после -NoExit.

  • Не делается попытка обойти действующую политику . То есть, если ваша система запрещает выполнение сценариев PowerShell, вызов команды завершится неудачно. Вы можете обойти политику выполнения, поместив
    -ExecutionPolicy Bypass после -NoExit, но это, очевидно, проблема безопасности.

    • Исходное определение команды пытается обойти политику, но только если действующая политика не AllSigned; однако, по крайней мере, в Windows 7 эта попытка имеет синтаксическую ошибку и поэтому неэффективна .
...