在哪里放置PowerShell脚本?

sco*_*obi 50 powershell

(我不敢相信我实际上是在问这个问题,但是我当天没有脑力.)

我刚刚写了我的第一个严肃的PowerShell脚本,我真的很高兴.我计划每天使用它.我希望能够从Posh命令行调用它.我会给它一个动词 - 名词类型的名字,但是现在它是一个简单的.ps1,而不是那些采用params等的高级函数之一.

那么它应该去哪里以及如何从Posh命令行调用它?我打算写更多!他们应该去哪儿?

  • 它应该是我个人资料中的功能吗?
  • 它应该走在我的道路上吗?
  • 它会进入PSMODULEPATH吗?无论如何,那里有什么样的东西?它是递归的还是像普通的PATH一样?

你们在哪里放置PowerShell脚本以及如何组织它们?我在制作C#和C++工具方面有很多经验,知道如何命名它们以及放置它们的位置.而在另一个极端我已经做了很多糟糕的.bat文件,这些文件通常是独立的或堆放在某个文件夹的堆中.但PowerShell似乎非常不同.你可以非常快速地制作糟糕的.bat文件类型的东西,或者你可以用它来构建库和复杂的服务.

我真的很喜欢在开始之前我应该​​如何开始组织这些事情的一些想法.显然每个人都不一样,所以我希望能有一些讨论.谢谢!

Jay*_*uzi 24

我将我的个人脚本放在与我的个人资料相同的文件夹中.然后我可以备份并一起版本.我的个人资料开头是:

$ProfileRoot = (Split-Path -Parent $MyInvocation.MyCommand.Path)
$env:path += ";$ProfileRoot"
Run Code Online (Sandbox Code Playgroud)

  • 使用$ script:MyInvocation.MyCommand.Path,参见[执行脚本的源路径](http://stackoverflow.com/questions/801967/how-can-i-find-the-source-path-of-an-执行脚本/ 6985381#6985381).你会遇到嵌套调用者的问题,即使是配置文件脚本,例如我有一个辅助函数来重新加载你的配置文件(在函数/变量编辑之后)但跳过所有一次性初始化(如加载.NET程序集). (2认同)

And*_*der 12

使用V2,您可以在配置文件所在的WindowsPowerShell目录中创建模块目录.当您运行import-module时,PS将自动查看该目录以加载模块.我在WindowsPowerShell下创建了一个"Scripts"目录,这是一个模块的兄弟目录.

我使用我的配置文件使用以下代码的变量设置一些目录:

PS>  cat $Profile
$scripts = "$(split-path $profile)\Scripts"
$modules = "$(split-path $profile)\Modules"
$docs    =  $(resolve-path "$Env:userprofile\documents")
$desktop =  $(resolve-path "$Env:userprofile\desktop")

PS> cat variable:\scripts
C:\Users\andy.schneider\Documents\WindowsPowerShell\Scripts

PS>  cat variable:\modules
C:\Users\andy.schneider\Documents\WindowsPowerShell\Modules
Run Code Online (Sandbox Code Playgroud)


ste*_*tej 10

我的建议: - 将脚本存储在目录中,例如c:\ posh - 将目录添加到$ env:path

$env:path += ";c:\posh"
Run Code Online (Sandbox Code Playgroud)

这可以确保您可能位于其他目录中,例如c:\ windows,但您可以调用该脚本

[c:\windows] > sampl[TAB] # it expands the name of file to sample.ps1, then hit enter
Run Code Online (Sandbox Code Playgroud)

如果你的文件sample.ps1包含函数定义并且你每次都导入它,那么我会考虑将这一行添加到你的$ profile文件中

. c:\posh\sample.ps1
Run Code Online (Sandbox Code Playgroud)

关于脚本组织..根据脚本的目的只有几个目录:)个人,开发,外部(下载),样本,...


And*_*son 8

这就是我做的:

注意:将"ModuleName"替换为有意义的内容.

创建一个模块并将其作为"C:\ Windows\System32\WindowsPowerShell\v1.0\Modules\ModuleName\ModuleName.psm1"保存在全局模块文件夹中.例如:

function global:FancyFunction() {
   # do something interesting here.
}

Export-ModuleMember -function FancyFunction 
Run Code Online (Sandbox Code Playgroud)

打开您的powershell配置文件并添加以下行,以确保每次启动PowerShell会话时都加载模块:

Import-Module ModuleName -Force
Run Code Online (Sandbox Code Playgroud)

您可以通过键入以下内容轻松找到您的powershell配置文件:

notepad $profile
Run Code Online (Sandbox Code Playgroud)

当您打开一个新的PowerShell会话时,您应该能够从控制台或其他脚本调用您的函数,而无需执行任何其他操作.