Подтвердить что ты не робот

Как я могу повторно использовать/импортировать код script в сценариях PowerShell?

Мне нужно создать PowerShell script, который делает то же самое, что и мой предыдущий script, но на этот раз мне нужно прочитать CSV файл вместо XML файл. Мой план состоит в создании PowerShell script, который имеет общие функции, необходимые для обоих сценариев, и повторно использовать этот общий файл script в обоих основных файлах.

Предположим, что я создаю 2 основных файла в 2 каталогах на диске C:\ и сохраняю свой общий файл и другие 3 rd партийные библиотеки в папке диска D:\, например. C:\script_1_folder\Script1.ps1, C:\script_2_folder\Script2.ps1, а общий файл и 3 библиотеки rd будут находиться в D:\script_common.

  • Как мне вызвать\повторно использовать общий файл в моих основных файлах (как получить путь, мне нужно создать экземпляр общего файла и как его использовать)

    В чем разница между

    $script_path    = $myinvocation.invocationname;      
    $script_folder  = split-path $script_path -parent;
    write-host  $script_folder  
    $script_name    = split-path $script_path -leaf;      
    $current_folder = [system.io.directory]::getcurrentdirectory()    
    [system.io.directory]::setcurrentdirectory($script_folder)
    Set-Location $script_folder
    add-type -path ".\AlexFTPS-1.1.0\AlexPilotti.FTPS.Client.dll"
    

    и

    $path = (split-path $MyInvocation.MyCommand.Path) 
    $loggerPath = $path + "\Logger\release\Logger.ps1";
    .$loggerPath; 
    $logger = Logger;   
    $logger.load($path + "\Logger\config\log4ps.xml","log.log"); 
    

    и какой лучший способ сделать это в отношении моей проблемы?

  • Как создать временную папку в папке временных файлов Windows?

4b9b3361

Ответ 1

Общий код в Powershell

Вы можете просто поместить код, который хотите включить в другой файл PS1, а затем "dot source", чтобы этот файл включал его в текущую область:

. D:\script_common\MyCode.ps1

Это все, что нужно.

Использование модуля

Вместо этого вы можете использовать модуль, который может быть включен с помощью командлета Import-Module. Возможно, вы использовали это для работы с такими вещами, как Active Directory, где вы могли бы сделать что-то вроде этого:

Import-Module ActiveDirectory

В этом случае вам нужно только имя модуля, потому что оно находится в специальном каталоге.

Чтобы написать свои собственные модули в Powershell, вы называете модуль расширением .psm1. Как правило, вы не делаете бесплатный плавающий код в одном из них; вы записываете функции, которые затем доступны для кода, который импортирует модуль.

Чтобы импортировать модуль script из любого места, используйте полный путь:

Import-Module D:\script_common\MyModule.psm1

Пути модулей

Когда вы создаете свои собственные модули, вы можете сохранить их в любом старом месте, а затем обратиться к ним по их полному пути (как указано выше). Есть также несколько местоположений, которые Powershell ищет для модулей:

  • $PSHome\Modules (% Windir%\System32\WindowsPowerShell\v1.0\Modules) - Зарезервировано для модулей, поставляемых с Windows. Не помещайте вещи здесь.
  • $Home\Documents\WindowsPowerShell\Modules (% UserProfile%\Documents\WindowsPowerShell\Modules)
  • % ProgramFiles%\WindowsPowerShell\Modules - это не упоминается в ссылке и, по-видимому, больше используется для модулей конфигурации желаемого состояния (возможно, потому, что это относится ко всей системе).

Это значения по умолчанию, но Powershell использует собственную переменную среды, называемую PSModulePath, чтобы определить, где искать, и, подобно PATH, вы можете добавить свою собственную папку к этой переменной.

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

Таким образом, если вы сохраняете модули и "сторонние" модули в одном и том же месте, это зависит от сторонних материалов. Он может устанавливать свои собственные модули в своем собственном месте и изменять путь, или он может просто позволить вам размещать их там, где вы хотите.

Создание папки Temp

Вы можете использовать переменные среды TEMP или TMP, чтобы получить путь к папке temp. Чтобы получить их в Powershell, используйте $env:TEMP или $env:TMP.

Вам нужно будет создать уникальное имя создаваемой папки. Один из способов сделать это может заключаться в использовании GUID:

$dirName = [System.Guid]::NewGuid().ToString()
New-Item -Path "$($env:TEMP)\$dirName"

Ответ 2

Вы должны иметь возможность рассчитать источник script следующим образом:

. "C:\script_common\script.ps1"

после этого вы можете использовать все функции, подобные тем, которые были в script, который вы используете.

Но... лучший способ сделать это - создать модуль с вашими общими функциями (Как здесь: Блог сценариев для скриптов. (Версия TL;DR: поместите функции в файл psm1, поместите в путь модуля, импортируйте с помощью Import-Module, прибыль)

Для создания папки:

New-Item C:\Temp\yourfolder -type directory

Ответ 3

Вот моя попытка создать систему шаблонов в powershell: https://github.com/kayasax/PowershellTemplate
Это позволяет повторно использовать функции, которые вы сохраняете в репозитории, используя теги в шаблоне например:
<include logging/log>
Содержимое файла log.ps1, найденного в каталоге регистрации репозитория функций, будет вставлено при преобразовании шаблона в script