如何在PowerShell脚本中重用/导入脚本代码?

时间:2014-11-25 23:07:18

标签: powershell

我必须创建一个与我的previous script完全相同的PowerShell脚本,但这次我必须读取CSV文件而不是XML文件。我的计划是创建一个PowerShell脚本,该脚本具有两个脚本所需的通用功能,并在两个主文件中重用这个通用脚本文件。

假设我在C:\驱动器的2个目录中创建了2个主文件,并将我的公共文件和其他3个 rd 方库保存在D:\驱动器的文件夹中,例如C:\script_1_folder\Script1.ps1C:\script_2_folder\Script2.ps1和公共文件以及3个 rd 方库将位于D:\script_common

  1. 如何在主文件中调用\重用公共文件(如何获取路径,是否必须创建公共文件的实例以及如何使用它)

    之间有什么区别
    $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"); 
    

    关于我的问题,最好的方法是什么?

  2. 如何在Windows临时文件夹中创建临时文件夹?

3 个答案:

答案 0 :(得分:67)

Powershell中的通用代码

您可以将要包含的代码放在不同的PS1文件中,然后点击源#34;该文件将其包含在当前范围内:

. D:\script_common\MyCode.ps1

那就是那个。

使用模块

您可以考虑使用模块,可以使用Import-Module cmdlet包含该模块。您可能已经使用它来处理Active Directory之类的东西,您可以在其中执行以下操作:

Import-Module ActiveDirectory

在这种情况下,您只需要模块的名称,因为它位于特殊目录中。

要在Powershell中编写自己的模块,请将模块命名为.psm1扩展名。通常,您不会在其中一个中执行浮动代码;您编写的函数随后可用于导入模块的代码。

要从任何地方导入脚本模块,请使用完整路径:

Import-Module D:\script_common\MyModule.psm1

模块路径

当您创建自己的模块时,可以将它们保留在任何旧位置,然后按照完整路径引用它们(如上所述)。还有几个locations that Powershell looks for modules

  • $PSHome\Modules(%Windir%\ System32 \ WindowsPowerShell \ v1.0 \ Modules) - 为Windows附带的模块保留。不要把东西放在这里。
  • $Home\Documents\WindowsPowerShell\Modules(%UserProfile%\ Documents \ WindowsPowerShell \ Modules)
  • %ProgramFiles%\ WindowsPowerShell \ Modules - 链接中没有提及,似乎更多地用于Desired State Configuration模块(可能因为它适用于整个系统)。

这些是默认设置,但是Powershell使用自己的环境变量PSModulePath来确定要查看的位置,就像PATH一样,您可以将自己的文件夹添加到该变量中。

这可以让您将模块保存在自己的位置。请参阅链接以获取有关如何构建文件夹以及如何命名的更多信息。

至于保留你的模块和#34;第三方"模块在同一个地方,取决于第三方的东西。它可以在自己的位置安装自己的模块并修改路径,或者它可以让你把它们放在任何你想要的地方。

创建临时文件夹

您可以使用TEMPTMP环境变量来获取临时文件夹的路径。要在Powershell中检索它们,请使用$env:TEMP$env:TMP

您必须想出一个要在其中创建的文件夹的唯一名称。一种方法可能是使用GUID:

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

答案 1 :(得分:5)

你应该可以像这样点源脚本:

. "C:\script_common\script.ps1"

之后,您可以使用他们在您正在运行的脚本中的所有功能。

但是...更好的方法是使用您的常用功能创建一个模块(如何在此处:Scripting Guy´s Blog。(TLDR版本:将函数放入psm1文件,放入模块路径,导入使用Import-Module,利润)

用于创建文件夹:

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

答案 2 :(得分:0)

以下是我在powershell中创建模板系统的尝试:https://github.com/kayasax/PowershellTemplate
它允许使用模板中的标记重用您在存储库中保存的函数 例如:
<include logging/log>
在将模板转换为脚本时,将插入在函数库的日志记录目录中找到的文件log.ps1的内容