我需要为我们的一个应用程序团队在短时间内运行一项任务,在其中必须输入目录并应搜索文件名字符串。他们为如何完成任务提供了建议,但每次都建议一种手动完成任务的方法。
我是使用PowerShell的菜鸟,并且会知道如何在GNU / Linux环境(而不是Windows)中使用它。
我已经组成了可以手动键入的示例命令,但是最初我想在桌面上创建一个快捷方式,如果单击该快捷方式,这些命令将在终端中运行并输出。我曾尝试将命令添加到.ps1文件并使用PowerShell运行,但是该外壳在启动后关闭了几秒钟,但未显示输出。
Set-Location D:\Path\To\Directory
findstr /S "MachineName" app_*.log
Get-Date
Write-host
我希望它能像手动输入一样显示输出,但是没有得到结果。
任何人都可以伸出援手吗?
答案 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_USER
(HKLM:
)来为所有用户进行更改,但是这样做需要具有管理权限。
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
来抑制这种情况。
未尝试绕过有效的execution policy。也就是说,如果系统不允许执行PowerShell脚本,则调用命令将失败。您可以通过在<{1}之后放置
-NoProfile
来绕过执行策略,但这显然是出于安全考虑。
-NoExit
时;但是,至少在Windows 7上,这种尝试在语法上存在缺陷,因此无效。