[英]How do I run a PowerShell script when the computer starts?
我有一个监视图像文件夹的 PowerShell 脚本。 我需要找到一种在计算机启动后自动运行此脚本的方法。
我已经尝试了以下方法,但无法正常工作。
使用msconfig
并将 PowerShell 脚本添加到启动,但我在该列表中找不到 PowerShell 脚本。
创建一个快捷方式并将其放到启动文件夹中。 没运气。
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
或者
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
这是我的 PowerShell 脚本:
$folder = "C:\\Doc\\Files" $dest = "C:\\Doc\\Files\\images" $filter = "*.jpg" $fsw = new-object System.IO.FileSystemWatcher $folder, $filter -Property @{ IncludeSubDirectories=$false NotifyFilter = [System.IO.NotifyFilters]'FileName, LastWrite' } $onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { Start-Sleep -s 10 Move-Item -Path C:\Doc\Files\*.jpg C:\Doc\Files\images }
我还尝试使用taskschd.msc
添加基本任务。 它仍然无法正常工作。
这是我发现的,也许这将有助于调试它。
如果我打开一个 PowerShell 窗口并在那里运行脚本,它就可以工作。 但如果我在命令提示符下运行它,
powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
不起作用。 我不确定这是权限问题还是其他问题。
顺便说一句,我安装了 PowerShell 3.0,如果我输入 $host.version,它将在那里显示 3。 但我的 powershell.exe 似乎仍然是 v1.0。
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
我终于让我的 PowerShell 脚本在每次启动时自动运行。 您将需要创建两个文件:第一个是 Powershell 脚本(例如script.ps1
),第二个是一个 .cmd 文件,其中包含将在命令提示符下运行的命令(例如startup.cmd
)。
第二个文件是计算机启动时需要执行的文件,简单地将 .ps1 复制粘贴到启动文件夹是行不通的,因为这实际上并没有执行脚本——它只是用记事本打开文件。 您需要执行 .cmd,它本身将使用 PowerShell 执行 .ps1。 好的,足够的唠叨和步骤:
%USERPROFILE%\桌面\ script.ps1
%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\ startup.cmd
这样做将在每次启动时执行 cmd 文件。 如果您需要帮助,这里是如何创建 .cmd 文件的链接。
PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell %USERPROFILE%\Desktop\script.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
这将做两件事:
此代码专门用于 PowerShell v1.0。 如果您运行的是 PowerShell v2.0,它可能会有所不同。 无论如何,请检查此源以获取 .cmd 代码。
现在您已经在各自的路径中拥有了 .ps1 和 .cmd 文件,并且每个文件都有脚本,所以您已经准备就绪。
您可以将其设置为计划任务,并将任务触发器设置为“启动时”
我所做的是创建一个放在 shell:startup 中的快捷方式。
快捷方式有以下内容:
目标: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "C:\scripts\script.ps1"
(用你需要的替换 scripts\scripts.ps1 )
开始于: C:\scripts
(用包含您的脚本的文件夹替换脚本)
您可以创建一个在开始时自动运行的调度程序任务,即使用户未登录:
schtasks /create /tn "FileMonitor" /sc onstart /delay 0000:30 /rl highest /ru system /tr "powershell.exe -file C:\Doc\Files\FileMonitor.ps1"
以管理员身份从 PowerShell 运行此命令一次,它将为您创建计划任务。 您可以像这样列出任务:
schtasks /Query /TN "FileMonitor" /V /FO List
或删除它
schtasks /Delete /TN "FileMonitor"
这实际上只是对@mjolinor 简单答案[使用任务计划程序] 的扩展。
我知道“任务计划程序”是正确的方式,但需要付出一些努力才能让它按照我想要的方式运行,并认为我会将我的发现发布给其他人。
问题包括:
注意:您必须具有运行脚本的权限,请参阅ExecutionPolicy
然后在Task Scheduler中,最重要/最棘手的部分是Action
应该是Start a Program
程序/脚本:
powershell
添加参数(可选):
-windowstyle hidden -command full\path\script.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
笔记:
如果您在互联网上看到-File
,它会起作用,但要理解-File
之后除了文件路径之外什么都没有,IE:重定向被视为文件路径的一部分并且失败,您必须结合使用-command
使用重定向,但您可以预先添加其他命令/参数,例如-windowstyle hidden
以不显示 PowerShell 窗口。
我还必须在我的脚本中将所有Write-Host
调整为Write-Output
。
先决条件:
1.使用“以管理员身份运行”选项启动powershell
2. 启用运行未签名的脚本:
set-executionpolicy remotesigned
3.准备你的powershell脚本并知道它的路径:
$path = "C:\Users\myname\myscript.ps1"
脚步:
1. 设置触发器,另见New-JobTrigger (PSScheduledJob) - PowerShell | 微软文档
$trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:30
2. 注册计划作业,另见Register-ScheduledJob (PSScheduledJob) - PowerShell | 微软文档
Register-ScheduledJob -Trigger $trigger -FilePath $path -Name MyScheduledJob
您可以使用Get-ScheduledJob -Name MyScheduledJob
检查它
3. 重新启动 Windows ( restart /r
) 并检查结果:
Get-Job -name MyScheduledJob
另请参阅Get-Job (Microsoft.PowerShell.Core) - PowerShell | 微软文档
参考:
将 ps1 复制到此文件夹中,并在必要时创建它。 它将在每次启动时运行(在用户登录之前)。
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
如果在您的操作系统版本上可用(可能没有较低级别的操作系统),也可以通过 GPEDIT.msc 完成。
尝试这个。 在启动文件夹和 iuput 中创建快捷方式
PowerShell "&.'PathToFile\script.ps1'"
这是最简单的方法。
可以肯定的是,每当您希望 PowerShell 自动/在后台/非交互式运行时,最好指定参数-ExecutionPolicy Bypass
to PowerShell.exe
PowerShell.exe -ExecutionPolicy Bypass
我也有一个启动文件系统观察程序的脚本,但是一旦关闭脚本窗口,观察程序就会死掉。 如果我从 powershell 窗口启动它并保持打开状态,它将运行一整天,但是在我关闭它的那一刻,脚本就会停止执行它应该做的事情。
您需要启动脚本并让它保持 powershell 打开。
我尝试了很多方法来做到这一点,但真正有效的方法来自http://www.methos-it.com/blogs/keep-your-powershell-script-open-when-executed
param ( $Show )
if ( !$Show )
{
PowerShell -NoExit -File $MyInvocation.MyCommand.Path 1
return
}
将其粘贴到脚本的顶部是使它起作用的原因。
我从命令行启动脚本
powershell.exe -noexit -command "& \path\to\script.ps1"
指定在 Windows 启动时执行的 Powershell 脚本的相对较短的路径可能是:
外壳:启动
通过右键单击创建一个新的快捷方式并在上下文菜单中选择菜单项:New=>Shortcut
创建脚本的快捷方式,例如:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "C:\Users\someuser\Documents\WindowsPowerShell\Scripts\somesscript.ps1"
注意-NoProfile的使用 如果您在 $profile 文件中进行了大量初始化,那么加载它以仅运行 Powershell 脚本是低效的。 -NoProfile 将跳过加载您的配置文件,如果不需要在执行 Powershell 脚本之前运行它,则可以智能地指定它。
在这里,您会看到创建了这样一个快捷方式(带有 Powershell 图标和快捷方式字形的 .lnk 文件):
这对我有用。 创建了具有以下详细信息的计划任务:触发器:启动时
操作:程序/脚本:powershell.exe 参数:-file
您可以在“启动”选项卡中的“任务管理器”中查看计划启动的脚本和更多内容。 以下是如何将新项目添加到计划的启动项目。
首先,打开资源管理器到 shell:startup location via start-button => run:
资源管理器外壳:启动
右键单击该文件夹,然后在上下文菜单中选择一个新的快捷方式。 输入以下内容:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "C:\myfolder\somescript.ps1"
这将在不启动 $profile 脚本的情况下启动 Powershell 脚本以加快执行速度。 这将确保 powershell 脚本已启动。
shell:startup 文件夹位于:
$env:APPDATA\Microsoft\Windows
然后进入文件夹:
开始菜单\程序\启动
像往常一样,当路径包含空格时,Microsoft 会让我们感到有些麻烦,因此在这种情况下,您必须在完整路径周围加上引号,或者只需在 Powershell 中点击选项卡即可自动完成。
如果您不想担心执行策略,可以使用以下内容并放入批处理脚本。 当网站上的技术人员运行我的脚本时,我经常使用它,因为有一半的时间他们说脚本不起作用,但实际上这是因为执行策略未定义我们的限制。 即使执行策略通常会阻止脚本运行,这也会运行脚本。
如果您希望它在启动时运行。 然后,您可以为单个用户放置shell:startup或为所有登录 PC 的用户放置shell:common 启动。
cmd.exe /c Powershell.exe -ExecutionPolicy ByPass -File "c:\path\to\script.ps1"
显然,如果您有一个域并放置在Scripts (Startup/Shutdown)中,那么制作 GPO 是您最好的方法; 在Computer 或 User Configurations\Windows Settings\Scripts (Startup/Shutdown)下。 如果您这样做,请在 ** 下创建一个名为Startup或其他内容的目录
\\yourdomain.com\netlogon\
并将其放在 GPO 中以供参考。 这样你就知道 DC 有权执行它。 当您在 DC 上浏览脚本时,您会在下面找到它
C:\Windows\SYSVOL\domain\scripts\Startup\
因为这是netlogon的本地路径。
执行下面的 PowerShell 命令以在用户登录时通过任务计划程序运行 PowerShell 脚本
.ps1
。
Register-ScheduledTask -TaskName "SOME TASKNAME" -Trigger (New-ScheduledTaskTrigger -AtLogon) -Action (New-ScheduledTaskAction -Execute "${Env:WinDir}\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument "-WindowStyle Hidden -Command `"& 'C:\PATH\TO\FILE.ps1'`"") -RunLevel Highest -Force;
-AtLogOn
- 表示触发器在用户登录时启动任务。
-AtStartup
- 表示触发器在系统启动时启动任务。
-WindowStyle Hidden
- 启动时不显示 PowerShell 窗口。 如果不需要,请删除。
-RunLevel Highest
- 以管理员身份运行 PowerShell。 如果不需要,请删除。
附言
如有必要,请执行以下 PowerShell 命令以启用 PowerShell 脚本执行。
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Unrestricted -Force;
Bypass
- 没有任何内容被阻止,也没有警告或提示。
Unrestricted
- 加载所有配置文件并运行所有脚本。 如果您运行从 Internet 下载的未签名脚本,系统会在运行前提示您获得许可。
我知道这里的人不需要这样的工具。 但我认为它对新手用户尤其有用。 自动启动工具 它是一款便携式免费软件,旨在简化登录 Windows 时自动启动应用程序或脚本的过程。 它提供了 3 种不同的自动启动选项
该工具最好的部分是支持 powershell 脚本 (.Ps1) 。 这意味着您可以在系统启动时使用所有 3 种方法自动运行 Powershell 脚本。
下载https://disk.yandex.com.tr/d/dFzyB2Fu4lC-Ww
来源: https ://www.portablefreeware.com/forums/viewtopic.php?f=4&t=25761
我发现的一件事。 如果您在 PowerShell 脚本中使用 Write-Host,并且还使用任务计划程序(如上面的帖子所示),则不会从命令行获得所有输出。
powershell.exe -command C:\scripts\script.ps1 >> "C:\scripts\logfile.log"
就我而言,我只看到从 PowerShell 脚本成功运行的命令的输出。
到目前为止,我的结论是 PowerShell 使用 Out-File 输出到另一个命令,或者在本例中为日志文件。
因此,如果您使用 *> 而不是 >>,您将从 CLI 获得 PowerShell 脚本的所有输出,并且您可以继续在脚本中使用 Write-Host。
powershell.exe -command C:\scripts\script.ps1 *> "C:\scripts\logfile.log"
https://lazyadmin.nl/powershell/output-to-file/
无论用户登录如何,您也可以在后台运行脚本。
在任务计划程序中的任务中设置“无论用户是否登录都运行”,然后在密码提示中输入您的主机名\用户名,然后输入您的密码(在我的情况下是具有管理员权限的帐户)。
我使用Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
来解决脚本执行问题。 不过,我仍然希望在每个进程的基础上运行它。 另一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.