从特定目录将所有函数加载到PowerShell中

Kdg*_*Dev 15 powershell

假设您是一名系统管理员,他使用PowerShell管理他/她的系统上的很多东西.

你可能已经编写了很多函数来执行你经常需要检查的东西.但是,如果你需要移动很多,使用不同的机器等等,你必须一次又一次地重新输入所有功能才能使用它们.每次我因为某些原因退出并重新启动PowerShell时,我甚至必须这样做,因为它不会记住功能......

我写了一个功能,为我做这个.我在这里发帖是因为我想确定它是万无一失的.函数本身存储在allFunctions.ps1,这就是我在代码中排除它的原因.

基本思想是你有一个文件夹,你可以在其中存储所有ps1文件,每个文件都包含一个函数.在PowerShell中,您转到该目录,然后输入:

. .\allFunctions.ps1
Run Code Online (Sandbox Code Playgroud)

该脚本的内容是这样的:

[string]$items = Get-ChildItem -Path . -Exclude allFunctions.ps1
$itemlist = $items.split(" ")
foreach($item in $itemlist)
{
    . $item
}
Run Code Online (Sandbox Code Playgroud)

此脚本将首先收集目录中的每个文件,这意味着您可能还拥有所有非ps1文件.将排除allFunctions.ps1.

然后我根据空格拆分长字符串,这是常用的分隔符.然后我用Foreach循环遍历它,每次将函数初始化为PowerShell.

假设你有超过100个功能,你永远不知道你需要哪些功能,哪些不会?为什么不输入所有而不是挑剔?

所以我想知道,这里会出现什么问题?我希望这是非常安全的,因为我可能会使用它很多.

aph*_*ria 15

将它们包含在PowerShell配置文件中,以便每次启动PS时它们都会自动加载.

查看Windows PowerShell配置文件,了解有关在何处查找配置文件脚本的详细信息.

PS将您的个人资料默认为"我的文档"文件夹.我的网络驱动器,所以我登录的任何地方,PowerShell指向相同的配置文件夹.


Jas*_*her 11

您可以以更简单的方式执行此操作.我在我的个人资料中有这个:

##-------------------------------------------
## Load Script Libraries
##-------------------------------------------
Get-ChildItem ($lib_home + "*.ps1") | ForEach-Object {& (Join-Path $lib_home $_.Name)} | Out-Null
Run Code Online (Sandbox Code Playgroud)

其中$ lib_home是一个存储我想要自动包含的脚本的文件夹.在这种情况下,它执行它们.所以我有脚本定义全局函数.你也可以点源它们(用"."代替"&").


Jar*_*Par 6

功能明智我认为有几种方法可以改进你的脚本.

首先,您的脚本依赖于脚本名称不变.虽然我不认为你可能会改变这个剧本的名字,但你永远不会知道从现在起几年后你会有什么样的心情.相反,为什么不动态地计算脚本的名称.

$scriptName = split-path -leaf $MyInvocation.MyCommand.Definition
Run Code Online (Sandbox Code Playgroud)

下一个问题是,如果您将目录放在包含空格的路径中,我相信您的拆分功能将失败.这将导致像"c:\ foo bar\baz.ps1"这样的路径显示为"c:\ foo","bar\baz.ps1".删除拆分更好,只需使用get-childitem命令进行枚举即可.

此外,您依赖当前路径作为包含脚本的路径.你应该使它成为一个显式参数或使用包含allFunctions.ps1文件的路径(我更喜欢后者)

这是我将使用的更新版本.

$scriptName = split-path -leaf $MyInvocation.MyCommand.Definition
$rootPath = split-path -parent $MyInvocation.MyCommand.Definition
$scripts = gci -re $rootPath -in *.ps1 | ?{ $_.Name -ne $scriptName }
foreach ( $item in $scripts ) {
  . $item.FullName
}
Run Code Online (Sandbox Code Playgroud)

从安全角度来看,您必须考虑恶意用户将坏脚本添加到目标目录的可能性.如果他们这样做,它将使用您的allFunctions.ps1文件执行,并可能对计算机造成损害.但是在恶意用户可以访问您的文件系统的时候,他们可能会在没有您的脚本帮助的情况下造成损害,所以这可能是一个小问题.