4

通常 powershell 脚本文件以 .ps1 结尾,模块以 .psm1 结尾。

可以在没有扩展名的文件中包含 powershell 脚本/模块吗?只是“构建”或“开始”等等?这会在任何特定环境中引起问题吗?

如果是,是否可以在具有其他“文本”扩展名(如 .sh、.ps 等)的文件中包含 powershell 脚本/模块?


有没有更简单的方法来调用 powershell 脚本而不是键入 .\script.ps1 arg1, arg2 ,例如:go arg1, arg2?

4

3 回答 3

5

不,你不能。的错误消息Import-Module非常清楚:

Import-Module : The extension '.xyz' is not a valid module extension. The supported module extensions are '.dll',
'.ps1', '.psm1', '.psd1', '.cdxml' and '.xaml'. Correct the extension then try adding the file

如果您尝试调用具有非标准扩展名的脚本,Windows 将简单地弹出“您想用什么程序打开它?” 对话。如果您选择使用 Powershell 打开,则会生成一个新的 Powershell 进程,该进程将执行相同的操作。

如果您尝试分配一个新的扩展名,例如.xyz始终使用 Powershell 打开,您最终将产生一系列永无止境的 Powershell 进程,每个进程都徒劳地尝试使用新的 Powershell 实例打开文件。我刚试过:)

于 2012-09-01T18:28:14.993 回答
3

这就是aliasPowershell 中的功能的用途。您可以创建脚本,正确地以 结尾.ps1,然后创建一个别名,以便您可以将其调用为buildstart或其他。

请参阅文档:get-help about_aliases

于 2012-09-02T14:39:04.703 回答
0

超级迟到的答案,但我想对我的 bin 文件夹中的所有脚本执行此操作,我花了一段时间才弄清楚。我结束了这个:

Get-ChildItem -path <bin where your ps1 files live> -Filter *.ps1 |
Foreach-Object{
    $name = $_.Name
    $scptName = $_.Name -split ".ps1",0,"simplematch"
    $scptName = $scptName[0]
    new-alias $name $scptName
}

而且我还希望它用于我的 python bin 中的所有 python 脚本,这更复杂但仍然可行:

Get-ChildItem -path <pybin path> -Filter *.py |
Foreach-Object{
    $name = $_.Name
    $scptName =  $_.Name -split '.py',0,'simplematch'
    $scptName = $scptName[0]
    $eName = $scptName -split '-',0,'simplematch'
    $eName = $eName[1]
    invoke-expression('
    $val' + $eName + ' = $name
    function doRun' + $eName + '{
        python "<pybin path>/$val' + $eName + '" $args
    }
    $alias = "doRun$ename"
    set-alias $scptName $alias
    ')
}

请注意,您正在对包含系统上文件名的表达式进行调用表达式,因此如果其他人可能会写入该目录,这是一个安全问题。因为这是我的 bin 目录,而且我一直在执行这些东西,所以我认为这并不重要,但它可以牢记这一点。

当然还有一种更优雅的方法可以实现这一点,但我不确定它是什么。

于 2020-02-17T04:09:27.300 回答