如何创建基本的PowerShell脚本以运行简单命令并将结果输出到终端?

时间:2019-06-01 12:29:29

标签: windows powershell

我需要为我们的一个应用程序团队在短时间内运行一项任务,在其中必须输入目录并应搜索文件名字符串。他们为如何完成任务提供了建议,但每次都建议一种手动完成任务的方法。

我是使用PowerShell的菜鸟,并且会知道如何在GNU / Linux环境(而不是Windows)中使用它。

我已经组成了可以手动键入的示例命令,但是最初我想在桌面上创建一个快捷方式,如果单击该快捷方式,这些命令将在终端中运行并输出。我曾尝试将命令添加到.ps1文件并使用PowerShell运行,但是该外壳在启动后关闭了几秒钟,但未显示输出。

Set-Location D:\Path\To\Directory
findstr /S "MachineName" app_*.log
Get-Date
Write-host

我希望它能像手动输入一样显示输出,但是没有得到结果。

任何人都可以伸出援手吗?

2 个答案:

答案 0 :(得分:0)

你说...

  

“我是使用PowerShell的菜鸟”

...请花点时间逐步提高限制/避免,误解,挫败感,不良习惯,不需要的错误等。跳转到YouTube,MSDN Channel9并搜索PowerShell,开始,中级,高级和PowerShell用户互动。

您正在混合批处理/ cmd文件的心态。因此,为什么不将其作为bat / cmd文件呢?

所以,让我们一步一步来。

实际上,无需物理上更改目录即可查找或搜索文件。

# Set-Location D:\Path\To\Directory

如果要保持PowerShell正常运行,请使用PowerShell cmdlet。 您还使用通配符,这意味着您需要所有日志文件,并且必须循环执行该操作。     #findstr / S“ MachineName” app _ *。log

所以根据您的需求,您只需要这个。

Select-String -Pattern 'SomeMachineName' -Path 'D:\Path\To\Directory'

我不确定您为什么要这样做。您没有将其用于任何用途。

Get-Date

Write-Host不会执行任何操作,直到您告诉它执行某些操作为止。如果您只是将内容发送到屏幕,则甚至不需要Write-Host,因为输出到屏幕是PowerShell的默认设置,除非您另有说明。

Write-host

因此,如果您只是想在文件中查找字符串并显示运行此命令的日期,那么就是这样。

# Search all log files for the string in the target directory and all child directories.
$LogPath = Read-Host -Prompt 'Enter the full directory path to the log files'
$SerachString = Read-Host -Prompt 'Enter a search string'
Get-ChildItem -Path $LogPath -Filter 'app_*.log' -Recurse | 
ForEach {
    Get-Date
    Select-String -Pattern $SerachString -Path $PSItem.FullName 
}

只需将以上内容另存为脚本即可。说,Get-LogInformation.ps1,然后创建一个启动powershell.exe并运行该文件的快捷方式。只需复制默认的PowerShell快捷方式,然后将脚本文件添加为参数即可。

某个链接...

powershell.exe 'D:\Scripts\Get-LogInformation.ps1' -Noprofile -noexit 

再次,可以更新,但是这表明您以前从未使用过PowewrShell,并且没有查看任何文档,帮助文件或视频。因此,再次强调一下,不要为使用PowerShell付出任何努力,而将时间花在上面的视频指示器上,以使自己感到舒适。

每天使用PowerShell运行cmd.exe中通常需要执行的所有操作,并避免使用DOS命令。始终确保PowerShell cmdlet。是的,有些可能有点长,但是为了交互使用,每个命令都有速记/别名版本以及相应的参数。

# Get parameters, examples, full and Online help for a cmdlet or function

# Get a list of all Modules
Get-Module -ListAvailable | 
Out-GridView -PassThru -Title 'Available modules'

# Get a list of all loaded Modules
Get-Module  | 
Out-GridView -PassThru -Title 'Available loaded modules'

# List all loaded session modules and the exposed cmdlets / functions in them
Get-Module -Name '*' | 
ForEach-Object { Get-Command -Module $PSItem }  | 
Out-GridView -PassThru -Title 'Available loaded modules and their cmdlets / functions'

# Get a list of all functions
Get-Command -CommandType Function | 
Out-GridView -PassThru -Title 'Available functions'

# Get a list of all commandlets
Get-Command -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available cmdlets'

# Get a list of all functions for the specified name
Get-Command -Name '*ADGroup*' -CommandType Function | 
Out-GridView -PassThru -Title 'Available named functions'

# Get a list of all commandlets for the specified name
Get-Command -Name '*ADGroup**'  -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available named cmdlet'

# get function / cmdlet details
Get-Command -Name Get-ChildItem -Syntax
(Get-Command -Name Get-ChildItem).Parameters.Keys


Get-help -Name Get-ChildItem -Full
Get-help -Name Get-ChildItem -Online
Get-help -Name Get-ChildItem -Examples

Get-help -Name Select-String -Full
Get-help -Name Select-String -Online
Get-help -Name Select-String -Examples


# Get parameter that accepts pipeline input
Get-Help Get-ChildItem -Parameter * | 
Where-Object {$_.pipelineInput -match 'true'} | 
Select * 


# Get named aliases 
Get-Alias | 
Out-GridView -PassThru -Title 'Available aliases'

# Get cmdlet / function parameter aliases
(Get-Command Get-ChildItem).Parameters.Values | 
where aliases | 
select Name, Aliases | 
Out-GridView -PassThru -Title 'Alias results for a given cmdlet or function.'


# All Help topics and locations
Get-Help about_*
Get-Help about_Functions

Get-Help about* | Select Name, Synopsis

Get-Help about* | 
Select-Object -Property Name, Synopsis |
Out-GridView -Title 'Select Topic' -OutputMode Multiple |
ForEach-Object { Get-Help -Name $_.Name -ShowWindow }

explorer "$pshome\$($Host.CurrentCulture.Name)"

答案 1 :(得分:0)

默认情况下,在桌面上的文件资源管理器/中打开(双击)*.ps1文件打开文件进行编辑,而不是运行它们-其中包括快捷文件指向*.ps1文件。

如您所说,您正在使用(预安装的) Run in PowerShell上下文菜单命令来明确地运行您的脚本。

该命令调用PowerShell 而没有 -NoExit,这意味着PowerShell打开一个新的控制台窗口,执行脚本文件,然后退出 ,从而自动关闭窗口 -也就是说,一旦脚本退出,您就不会看到脚本的输出。

您有三个基本选择:

(a)要解决所有脚本(以及指向它们的快捷方式文件)的问题,请重新定义自定义命令,以使PowerShell会话使用{{1 }},这意味着在脚本执行完成后,窗口始终保持打开状态-见下文。

(b)对于给定的 脚本(以及指向该脚本的快捷文件),请对其进行修改以在末尾放置-NoExit命令,会话将打开,直到用户按下Enter键为止;例如Read-Host-请注意,尽管这允许您检查脚本的输出,但是您将无法以这种方式保持会话的活动状态;您要做的只是推迟关闭窗口。

(c)对于指向Read-Host "Press Enter to exit"文件的给定快捷方式文件 ,通过替换以下位置的*.ps1字段来修改快捷方式文件的属性:属性对话框以使用Target:显式调用PowerShell;例如,如果-NoExit字段包含Target:,则将其替换为
c:\scripts\foo.ps1


更新powershell.exe -NoExit -File "c:\scripts\foo.ps1"上下文菜单命令以使会话在脚本执行后保持活动状态。


重要:在Windows 10的某些版本中,Run in PowerShell命令 可能不可用。例如,在运行Windows的计算机上10,版本1803,以下技术不起作用:尽管命令定义仍存在于Run in PowerShell的注册表中,但文件资源管理器似乎忽略了那里的定义。如果有人知道为什么,请告诉我们。 次优的解决方法是为 all 文件类型定义命令;也就是定位HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0


执行以下命令,该命令将更新'HKCU:Software\Classes\*\Shell\Run in PowerShell\command'文件的标准Run in PowerShell上下文菜单命令,以便在新的PowerShell会话中执行它们,并在打开后保持打开脚本终止。
请注意,更新的范围是当前用户帐户(*.ps1 == HKCU:);您可以使用HKEY_CURRENT_USERHKLM:)来为所有用户进行更改,但是这样做需要具有管理权限。

HKEY_LOCAL_MACHINE

注意:

  • 与原始命令一样,您的$null = New-Item -Force -Path 'HKCU:Software\Classes\Microsoft.PowerShellScript.1\Shell\0\command' | New-ItemProperty -Force -Name '(default)' -Value "$PSHOME\powershell.exe -NoExit -File `"%1`"" 文件仍处于加载状态-您可以通过在<{1}之后放置
    $PROFILE来抑制这种情况。

    < / li>
  • 未尝试绕过有效的execution policy。也就是说,如果系统不允许执行PowerShell脚本,则调用命令将失败。您可以通过在<{1}之后放置
    -NoProfile来绕过执行策略,但这显然是出于安全考虑。

    • 原始命令定义会尝试绕过该策略,但前提是有效策略不是-NoExit时;但是,至少在Windows 7上,这种尝试在语法上存在缺陷,因此无效