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

blu*_*bel 43 powershell

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

假设我在创建2个目录2个主文件C:\的车程,让我的共同文件和其他3 党库的文件夹中的D:\驱动器,例如C:\script_1_folder\Script1.ps1,C:\script_2_folder\Script2.ps1与常见的文件和3 党库将在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"
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

bri*_*ist 72

Powershell中的通用代码

您可以将要包含的代码放在不同的PS1文件中,然后将"dot source"文件包含在当前范围中:

. D:\script_common\MyCode.ps1
Run Code Online (Sandbox Code Playgroud)

这就是全部.

使用模块

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

Import-Module ActiveDirectory
Run Code Online (Sandbox Code Playgroud)

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

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

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

Import-Module D:\script_common\MyModule.psm1
Run Code Online (Sandbox Code Playgroud)

模块路径

当您创建自己的模块时,您可以将它们保留在任何旧位置,然后按其完整路径引用它们(如上所述).Powershell还有几个位置寻找模块:

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

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

这使您可以将模块保存在自己的位置.有关如何构建文件夹以及如何命名的详细信息,请参阅该链接.

因此,只要将模块和"第三方"模块保持在同一位置,这取决于第三方的东西.它可以在自己的位置安装自己的模块并修改路径,也可以让它将它们放在任何你想要的位置.

创建临时文件夹

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

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

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


Pau*_*aul 7

您应该能够像这样点缀脚本源代码:

. "C:\script_common\script.ps1"
Run Code Online (Sandbox Code Playgroud)

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

但是...更好的方法是使用常用功能创建一个模块(操作方法:Scripting Guy的博客。(TLDR版本:将功能放入psm1文件中,放入模块路径中,使用导入Import-Module,获利)

创建文件夹:

New-Item C:\Temp\yourfolder -type directory
Run Code Online (Sandbox Code Playgroud)

  • 路径周围的引语很重要。根据我的经验`。.\awesoem\script.ps1` 不起作用,但是 `. ".\awesoem\script.ps1"` 确实有效。 (2认同)