Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 没有带基本PowerShell功能的输出_Function_Powershell - Fatal编程技术网

Function 没有带基本PowerShell功能的输出

Function 没有带基本PowerShell功能的输出,function,powershell,Function,Powershell,我刚开始与PowerShell相处已经有一段时间了,到今天为止,我可以说我已经完成了很多日常任务。在学校里,每一天都是新的一天,而现在,当我开始使用函数时,我又犯了错误。。。 我的问题是: 即使使用许多初学者教程中最简单的功能,它也无法在我的工作PC、家用PC或工作的管理服务器上运行 例如: function MyDate { Get-Date } 将名为MyDate.PS1的PS1文件保存到本地文件夹,然后从PowerShell提示符下运行这个小东西,就像这样 PS C:\PS>

我刚开始与PowerShell相处已经有一段时间了,到今天为止,我可以说我已经完成了很多日常任务。在学校里,每一天都是新的一天,而现在,当我开始使用函数时,我又犯了错误。。。 我的问题是:

即使使用许多初学者教程中最简单的功能,它也无法在我的工作PC、家用PC或工作的管理服务器上运行

例如:

function MyDate {
    Get-Date
}
将名为MyDate.PS1的PS1文件保存到本地文件夹,然后从PowerShell提示符下运行这个小东西,就像这样

PS C:\PS> C:\PS\MyDate.ps1
这就是PS Functions for Dummies教程中确切解释的方法。 仅在教程中,输出应显示日期。在我看来,什么都没有。没有错误,没有红色PS特定信息,什么都没有! 如果我在完整脚本中使用该函数,如下所示:

function MyDate {
    Get-Date
}
MyDate

PS C:\PS> C:\PS\MyDate.ps1

Montag, 1. Oktober 2018 19:28:32
好的,然后我得到日期输出。 不知道为什么不直接从提示中调用脚本中的函数,因为函数应该被使用? 再说一次,在这些非常简单的例子中,它应该是有效的。。 那我错在哪里呢


编辑:不确定这是否是向问题添加更多更新的正确策略

我可能会分享一个更具体的脚本示例,以及如何将其“转换”为函数。简单的例子是:

$myServers = Get-Content D:\Servers\Windows2016.txt
foreach ($myServer in $myServers) {
    Get-Printer -ComputerName $myServer |
        Where-Object {$_.DeviceType -eq "Printer"} |
        Select Name, PortName
}
对于其他支持团队,它必须尽可能简单。所以我的想法是围绕这几行“包装”一个函数,这样另一个人就可以像这样执行它

C:\Scripts\Our-Printers -File D:\Servers\Windows2016.txt
我们的打印机
当然会成为我的函数名


我已经试过了,但是放弃了那些东西,虽然在第一次尝试时它不起作用,这就是为什么我想从一些基本的东西开始,而现在我似乎不明白。但顺便说一句,在脚本中,我的函数已经工作了,只是它们不需要以示例的方式进行输入。这意味着我在一个大脚本中定义了函数,并且可以根据用户输入更改顺序,甚至跳过某些函数…

当脚本文件中有函数定义,并且要“导入”该函数时,需要使用点源(
)操作符:

PS C:\PS> . C:\PS\MyDate.ps1
PS C:\PS> MyDate
Montag, 1. Oktober 2018 19:39:18

使用
运算符与仅按名称调用脚本之间的区别在于
运算符在调用范围内运行脚本-这意味着在脚本停止执行后,函数定义将保留在powershell会话中


您可以在

中阅读有关作用域的更多信息。在脚本中定义函数意味着您编写了一段可以通过符号名调用的代码。不过,运行脚本不会自动调用该函数。你仍然需要这样做

PS C:\> Get-Content .\a.ps1 function GetDate { Get-Date } PS C:\> .\a.ps1 PS C:\> Get-Content .\b.ps1 function GetDate { Get-Date } GetDate # ← actually invoke the function PS C:\> .\b.ps1 Montag, 1. Oktober 2018 19:50:32 参数定义分别位于脚本或函数的开头

添加,以便人们可以运行
获取我们打印机的帮助
我们的打印机-?
,查看他们应该如何使用它,例如


用于强制执行有效输入,例如

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path -LiteralPath $_})]
    [string]$File
)

谢谢你的快速回答。尝试运行脚本,然后使用。C:\PS\MyDate.ps1,但仍然没有输出。在所有教程中也没有提到这是必需的。我现在读了一些关于scopes的内容,基本上我现在在使用控制台中的脚本时遇到了问题。此外,给出的示例中没有一个适合我。我没有收到任何错误,但是函数不起作用[link]>>Example page()@Obsolet很好,运行包含函数定义的脚本本身不应该做任何事情!定义一个函数和执行一个函数是两个截然不同的动作。我只是想在做大之前先从小事做起。我为自动化应用程序安装编写了脚本,甚至更多,如常规服务器检查等。我希望通过简单地将脚本创建为函数,并允许传递服务器名称或服务器列表文件的路径,使其他使用脚本的团队的工作更轻松,它将像我的服务器一样检查D:\Servers\Windows2016.txt。而不是提示甚至编辑脚本中的行。当我接受培训时,我发现它可以立即使用这些迷你产品。我知道示例是uslessjust另一个示例:这应该也可以:
code
function hello world{write host“hello world”}我想我离得有点近了,这并不意味着我完全理解;)我现在可以使用“.”的方式,然后我只键入Mydate,它就给了我正确的输出。也许我说到点子上了……也许:)谢谢!第一眼就看不懂,但现在我开始明白了。就在那时,我不理解这些教程,因为它们从来没有提到过这些方法。只要更新不会使已经给出的答案无效或将预期结果更改为与最初陈述不同的内容,就鼓励编辑以澄清问题。对于后者,最好在那里发布一个新问题并引用前一个问题。
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)]
    [string]$File
)

$myServers = Get-Content $File
foreach ($myServer in $myServers) {
    Get-Printer -ComputerName $myServer |
        Where-Object {$_.DeviceType -eq "Printer"} |
        Select-Object Name, PortName
}
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path -LiteralPath $_})]
    [string]$File
)