【问题标题】:Can I have powershell scripts in file with no extension?我可以在文件中包含没有扩展名的 powershell 脚本吗?
【发布时间】:2012-08-27 03:36:11
【问题描述】:

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

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

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


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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    不,你不能。 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 进程,该进程将执行相同的操作。

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

    【讨论】:

    • 感谢您的及时答复! “产生了永无止境的 Powershell 进程系列”......我们是否偶然发现了一个 Windows 漏洞?我还编辑了我的问题。
    • 我不确定这是否是一个漏洞,而更像是一种有趣的方式来踢自己的脚。有很多这样的机会:)
    • 关于您的后续行动,有两种方法。如果您在变量中有脚本的完整路径(例如$myscript),您可以像这样调用& $myscript arg1 arg2。或者,更好的解决方案是将有用的脚本和函数编写为模块,这样您就可以一次将所有内容作为库导入。然后,您可以使用易于调用的短名称为您喜欢的函数/cmdlet 起别名,并且在导入后您根本不需要处理脚本。
    【解决方案2】:

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

    查看文档:get-help about_aliases

    【讨论】:

      【解决方案3】:

      超级迟到的答案,但我想为我的 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 目录,而且我一直在执行这些东西,所以我认为这无关紧要,但请记住这一点。

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

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多