我可以在没有扩展名的文件中使用powershell脚本吗?

时间:2012-09-01 18:19:42

标签: powershell

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

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

如果是,可以在包含.sh,.ps等其他“texty”扩展名的文件中使用PowerShell脚本/模块吗?


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

3 个答案:

答案 0 :(得分: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实例。我刚尝试过:)

答案 1 :(得分:1)

这就是Powershell中alias功能的用途。您可以创建脚本,在.ps1中正确结束,然后创建别名,以便您可以将其作为buildstart或其他任何内容调用。

请参阅文档:get-help about_aliases

答案 2 :(得分: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目录,并且无论如何我一直在执行这些东西,所以我认为这无关紧要,但是可以记住这一点。

当然,还有一种更优雅的方法可以完成此操作,但是我不确定它是什么。