Как я могу повторно использовать / импортировать код скрипта в скриптах PowerShell?
Мне нужно создать сценарий PowerShell, который будет работать точно так же, как и мой предыдущий сценарий, но на этот раз мне придется читать файл CSV вместо файла XML. Я планирую создать сценарий PowerShell, который имеет общие функции, необходимые для обоих сценариев, и повторно использовать этот общий файл сценариев в обоих основных файлах.
Предположим, я создаю 2 основных файла в 2 C:\
диск и храните мой общий файл и другие сторонние библиотеки в папке D:\
диск, например C:\script_1_folder\Script1.ps1
, C:\script_2_folder\Script2.ps1
и общие файловые и сторонние библиотеки будут в 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?
3 ответа
Common Code In Powershell
You can just put the code you want to include in a different PS1 file, and then "dot source" that file to include it in the current scope:
. D:\script_common\MyCode.ps1
That's all there is to that.
Using a Module
You might consider using a module instead, which can be included using the Import-Module
Командлет. You might have used this to work with things like Active Directory, where you could do something like this:
Import-Module ActiveDirectory
In that case, you only need the name of the module because it's in a special directory.
To write your own modules in Powershell, you name the module with a .psm1
расширение. Typically, you don't do free floating code in one of these; you write functions which are then available to the code which imports the module.
To import a script module from anywhere, use the full path:
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
или же TMP
переменные окружения, чтобы получить путь к временной папке. Чтобы получить их в Powershell, используйте $env:TEMP
или же $env:TMP
,
Вам нужно придумать уникальное имя папки, чтобы создать там. Одним из способов сделать это может быть использование GUID:
$dirName = [System.Guid]::NewGuid().ToString()
New-Item -Path "$($env:TEMP)\$dirName"
Вы должны иметь возможность поставить исходный текст сценария так:
. "C:\script_common\script.ps1"
после этого вы можете использовать все функции, которые были в скрипте, который вы запускаете.
Но... лучший способ сделать это - создать модуль с вашими общими функциями (Как это сделать: блог сценариев для парней. (Версия TLDR: поместить функции в файл psm1, поместить в путь модуля, импортировать с помощью Import-Module
, прибыль)
Для создания папки:
New-Item C:\Temp\yourfolder -type directory
Вот моя попытка создать систему шаблонов в powershell: https://github.com/kayasax/PowershellTemplate
Это позволяет повторно использовать функции, которые вы сохраняете в репозитории, используя теги в шаблоне, например:<include logging/log>
Содержимое файла log.ps1, найденного в каталоге журналов репозитория функций, будет вставлено при преобразовании шаблона в сценарий.