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

标签 powershell

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

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

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

    有什么区别

    $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 临时文件夹中创建临时文件夹?

最佳答案

Powershell 中的常用代码

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

. D:\script_common\MyCode.ps1

这就是全部内容。

使用模块

您可以考虑改用模块,可以使用 Import-Module cmdlet 包含该模块。您可能已经使用它来处理 Active Directory 等内容,您可以在其中执行如下操作:

Import-Module ActiveDirectory

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

要在 Powershell 中编写您自己的模块,您可以使用 .psm1 扩展名来命名该模块。通常,您不会在其中之一中执行自由 float 代码;您编写的函数随后可供导入模块的代码使用。

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

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 - 链接中未提及,并且似乎更多地用于所需状态配置模块(可能是因为它适用于整个系统)。

这些是默认值,但 Powershell 使用自己的名为 PSModulePath 的环境变量来确定查找位置,并且与 PATH 非常相似,您可以将自己的文件夹添加到其中该变量。

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

因此,就将模块和“第 3 方”模块保持在同一位置而言,这取决于第 3 方的内容。它可能会在自己的位置安装自己的模块并修改路径,或者它可能只是让您将它们放在您想要的任何地方。

创建临时文件夹

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

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

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

关于powershell - 如何在 PowerShell 脚本中重用/导入脚本代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27138483/

相关文章:

PowerShell 5.1 - 如何卸载当前使用的模块

azure 管道-根据触发的分支设置变量

powershell - 如何搜索包含特定值的哈希表键?电源外壳

Powershell 管道导致内存使用量爆炸式增长

bash - 从 Windows PowerShell 运行 bash 脚本

powershell - 如何从 Invoke-Sqlcmd 诊断此异常?

powershell - 使用 powershell 从 azure 存储导入发布设置文件

azure - 创建2个publicIP并分配给nics

powershell - 如何使用 PowerShell 脚本禁用所有 BizTalk 主机实例

azure - Octopus 部署在 azure 和绿色的环境中