繁体   English   中英

如何在计算机启动时运行 PowerShell 脚本?

[英]How do I run a PowerShell script when the computer starts?

我有一个监视图像文件夹的 PowerShell 脚本。 我需要找到一种在计算机启动后自动运行此脚本的方法。

我已经尝试了以下方法,但无法正常工作。

  1. 使用msconfig并将 PowerShell 脚本添加到启动,但我在该列表中找不到 PowerShell 脚本。

  2. 创建一个快捷方式并将其放到启动文件夹中。 没运气。

     %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 }
  3. 我还尝试使用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。 好的,足够的唠叨和步骤:

  1. 创建您的 .ps1 脚本并将其放在一个文件夹中。 为了简单起见,我把它放在我的桌面上。 路径看起来像这样:

%USERPROFILE%\桌面\ script.ps1

  1. 创建一个 .cmd 文件并将其放入

%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\ startup.cmd

这样做将在每次启动时执行 cmd 文件。 如果您需要帮助,这里是如何创建 .cmd 文件的链接

  1. 使用文本编辑器打开 .cmd 文件并输入以下行:
PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell %USERPROFILE%\Desktop\script.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

这将做两件事:

  1. 将 PowerShell 的执行策略设置为无限制。 这是运行脚本所必需的,否则 PowerShell 不会执行此操作。
  2. 使用 PowerShell 执行在指定路径中找到的 .ps1 脚本。

此代码专门用于 PowerShell v1.0。 如果您运行的是 PowerShell v2.0,它可能会有所不同。 无论如何,请检查此源以获取 .cmd 代码。

  1. 保存 .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 简单答案[使用任务计划程序] 的扩展。

我知道“任务计划程序”是正确的方式,但需要付出一些努力才能让它按照我想要的方式运行,并认为我会将我的发现发布给其他人。

问题包括:

  • 将输出重定向到日志
  • 隐藏 PowerShell 窗口

注意:您必须具有运行脚本的权限,请参阅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 | 微软文档

参考:

  1. 如何启用 PowerShell 脚本的执行? - 超级用户
  2. 使用 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 脚本的相对较短的路径可能是:

  1. 单击 Windows 按钮(Windows 按钮 + r)
  2. 输入这个:

外壳:启动

  1. 通过右键单击创建一个新的快捷方式并在上下文菜单中选择菜单项:New=>Shortcut

  2. 创建脚本的快捷方式,例如:

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 种不同的自动启动选项

  1. 任务计划程序
  2. 启动文件夹
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM