【问题标题】:如何在计算机启动时运行 PowerShell 脚本?
【发布时间】:2014-01-01 17:43:39
【问题描述】:

我有一个监控图像文件夹的 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
    

【问题讨论】:

  • v1.0 powershell.exe 是 v3。 MSFT 只是懒于将文件移动到新文件夹的新版本。即 x64 上的 System32 是 x64 而 syswow64 是 32 位。
  • 你真的需要把前几行 'c:\\doc\\files' 加倍吗,为什么不用 c:\doc\files 呢?
  • 你是不是偶然在超级用户上重复发帖?

标签: powershell


【解决方案1】:

我终于让我的 PowerShell 脚本在每次启动时自动运行。您需要创建两个文件:第一个是 Powershell 脚本(例如 script.ps1),第二个是 .cmd 文件,其中包含将在命令提示符下运行的命令(例如 startup.cmd)。

第二个文件是计算机启动时需要执行的文件,简单地将 .ps1 复制粘贴到启动文件夹是行不通的,因为这实际上并没有执行脚本 - 它只是打开文件用记事本。您需要执行 .cmd,它本身将使用 PowerShell 执行 .ps1。好的,废话不多说,进入步骤:

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

C:\Users\user_name>\Desktop\script.ps1

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

C:\Users\user_name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\startup.cmd

这样做会在每次启动时执行 cmd 文件。 Here is a link of how to create a .cmd file 如果您需要帮助。

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

这将做两件事:

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

此代码专门用于 PowerShell v1.0。如果您运行的是 PowerShell v2.0,它可能会有所不同。在任何情况下,请检查 this source 以获取 .cmd 代码。

  1. 保存 .cmd 文件

现在您已将 .ps1 和 .cmd 文件放在各自的路径中,并为每个文件添加了脚本,一切就绪。

【讨论】:

  • 对我来说,它仅在管理员用户登录时执行命令,而不是像我期望的那样在每次系统启动时执行
  • @ThiagoAlves 作为管理员,在开始菜单中找到“启动”文件夹,右键单击它,然后单击“打开所有用户”。将您的脚本.cmd 放在那里,它应该在任何用户登录时运行。这与在启动时运行(即在任何用户登录之前)不同,但很可能足够接近。
  • @ThiagoAlves 如果登录用户不是管理员,则将 CurrentUser(不要替换您的用户名)添加到第一个命令的末尾......就像这样:PowerShell -Command "Set-ExecutionPolicy Unrestricted CurrentUser"
  • @DanRoss 这仍然对我不起作用。我在 AWS EC2 Microsoft Windows Server 2019 Base - ami-0bbdf9279190cdd33 上。我的任务运行,但只有在我 RDP 进入实例之后。
  • 对于一个当用户登录在登录提示(又名“PC 启动时")...
【解决方案2】:

您可以将其设置为计划任务,并将任务触发器设置为“启动时”

【讨论】:

  • 确保将 Set-ExcutionPolicy 提升为 RemoteSigned 或您选择的首选项。那么你的“ %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1" 方法应该可以工作。
  • 仍然无法正常工作,这是正确的吗? powershell.exe -ExecutionPolicy 不受限制 -File "C:\Doc\Files\FileMonitor.ps1"
  • 我相信您还需要指定 -NoExit 以便它继续运行,否则它只会注册事件然后退出,并随之取消事件注册。
  • 确保选中允许它在没有用户登录时运行的复选框。
  • 这是正确的答案,但我在实施过程中遇到了一些问题,对此进行了扩展,请参阅 --> stackoverflow.com/a/64096259/5079799
【解决方案3】:

我要做的是创建一个快捷方式,并将其放在 shell:startup 中。

快捷方式如下:

目标:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "C:\scripts\script.ps1"

(将 scripts\scripts.ps1 替换为您需要的内容)

开始于:C:\scripts

(将脚本替换为包含您的脚本的文件夹)

【讨论】:

  • 很难让它发挥作用。然后我意识到我没有指定“开始”。设置后(根据您的回答),它起作用了。谢谢。
  • 这会弹出一个powershell窗口,这正是我想要的。
  • “shell:startup”和“Start In: C:\scripts”在哪里以及是什么?谢谢
  • @TimothyL.J.Stewart 当您查看快捷方式的属性时,有一个“开始于”选项,您可以添加脚本所在的文件夹。 Shell:startup 可以通过打开 Run (Win+R) 并输入shell:startup来打开
  • 这在我手动登录时运行,而不是在 VM 启动时运行 :-(
【解决方案4】:

您可以创建一个在开始时自动运行的调度程序任务,即使用户未登录:

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"

【讨论】:

【解决方案5】:

这实际上只是对@mjolinor simple answer [使用任务计划程序] 的扩展。

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

问题包括:

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

注意:你必须有权限才能运行脚本见ExecutionPolicy

然后在Task Scheduler中,最重要/最棘手的部分是Action

应该是Start a Program

程序/脚本:

powershell

添加参数(可选):

-windowstyle hidden -command full\path\script.ps1 &gt;&gt; "%TEMP%\StartupLog.txt" 2&gt;&amp;1

注意:

如果您在互联网上看到-File,它会起作用,但要了解除了文件路径之外,-File 后面不能有任何内容,IE:重定向被视为文件路径的一部分并且失败,您必须将 -command 与重定向结合使用,但您可以在前面添加其他命令/参数,例如 -windowstyle hidden,以不显示 PowerShell 窗口。

我还必须将脚本中的所有 Write-Host 调整为 Write-Output

【讨论】:

    【解决方案6】:

    先决条件:

    1。使用“以管理员身份运行”选项启动 powershell

    2。启用运行未签名的脚本:

    set-executionpolicy remotesigned
    

    3。准备好你的 powershell 脚本并知道它的路径:

    $path = "C:\Users\myname\myscript.ps1"
    

    步骤:

    1。设置触发器,另见New-JobTrigger (PSScheduledJob) - PowerShell | Microsoft Docs

    $trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:30
    

    2。注册一个预定的作业,另见Register-ScheduledJob (PSScheduledJob) - PowerShell | Microsoft Docs

    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 | Microsoft Docs

    参考资料:

    1. How to enable execution of PowerShell scripts? - Super User
    2. Use PowerShell to Create Job that Runs at Startup | Scripting Blog

    【讨论】:

      【解决方案7】:

      将 ps1 复制到此文件夹中,并在必要时创建它。它将在每次启动时运行(在用户登录之前)。

      C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
      

      如果在您的操作系统版本上可用,也可以通过 GPEDIT.msc 完成(可能没有较低级别的操作系统)。

      【讨论】:

      • 我已将我的 ps1 文件复制到上述文件夹中。它对我不起作用......你有什么想法,可能是什么原因?
      【解决方案8】:

      请确保,当您希望 PowerShell 自动/在后台/非交互式运行时,最好指定参数 -ExecutionPolicy Bypass 到 PowerShell.exe

      PowerShell.exe -ExecutionPolicy Bypass

      【讨论】:

        【解决方案9】:

        我也有一个启动文件系统观察程序的脚本,但是一旦脚本窗口关闭,观察程序就会死掉。如果我从 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 "&amp; \path\to\script.ps1"

        【讨论】:

        • “methos-it”链接已失效。你有替补吗?
        【解决方案10】:

        试试这个。在启动文件夹和 iuput 中创建快捷方式

        PowerShell "&.'PathToFile\script.ps1'"
        

        这是最简单的方法。

        【讨论】:

        • 我必须删除“。”在“&”之后,它才能工作。
        【解决方案11】:

        指定在 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 脚本之前运行它,则可以智能地指定它。

        您在这里看到了这样一个创建的快捷方式(.lnk 文件,带有 Powershell 图标和快捷方式字形):

        【讨论】:

          【解决方案12】:

          这对我有用。创建了具有以下详细信息的计划任务: 触发器:启动时

          行动: 程序/脚本:powershell.exe 参数:-file

          【讨论】:

            【解决方案13】:

            您可以在“启动”选项卡中的“任务管理器”中查看计划启动的脚本和更多内容。以下是如何将新项目添加到计划的启动项目。

            首先,打开资源管理器到 shell:startup location via start-button => run:

            浏览器外壳:启动

            右键单击该文件夹,然后在上下文菜单中选择一个新的快捷方式。输入以下内容:

            C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -命令“C:\myfolder\somescript.ps1”

            这将启动一个 Powershell 脚本,而无需启动您的 $profile 脚本以加快执行速度。这将确保 powershell 脚本已启动。

            shell:startup 文件夹位于:

            $env:APPDATA\Microsoft\Windows

            然后进入文件夹:

            开始菜单\程序\启动

            像往常一样,当路径包含空格时,Microsoft 会为我们带来一些麻烦,因此在这种情况下,您必须在完整路径周围加上引号,或者只需在 Powershell 中点击 tab 即可自动完成。

            【讨论】:

              【解决方案14】:

              如果您不想担心执行策略,可以使用以下内容并放入批处理脚本。当网站上的技术人员运行我的脚本时,我经常使用它,因为有一半的时间他们说脚本不起作用,但实际上这是因为执行策略未定义我们的限制。即使执行策略通常会阻止脚本运行,这也会运行脚本。
              如果您希望它在启动时运行。然后您可以为单个用户放置 shell:startup 或为所有用户放置 shell:common startup登录电脑。

              cmd.exe /c Powershell.exe -ExecutionPolicy ByPass -File "c:\path\to\script.ps1"

              显然,如果您有一个域并放置在 Scripts (Startup/Shutdown) 中,那么制作 GPO 是您最好的方法;在计算机或用户配置\Windows 设置\脚本(启动/关机)下。 如果您这样做,请创建一个名为 Startup 或 **

              下的目录

              \\yourdomain.com\netlogon\

              并将其放在 GPO 中以供参考。这样你就知道 DC 有权执行它。当您在 DC 上浏览脚本时,您会在

              下找到它

              C:\Windows\SYSVOL\domain\scripts\Startup\

              因为这是 netlogon 的本地路径。

              【讨论】:

                【解决方案15】:

                执行下面的 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 下载的未签名脚本,系统会在运行前提示您获得许可。

                【讨论】:

                  猜你喜欢
                  • 2019-11-27
                  • 2021-12-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-10-14
                  • 1970-01-01
                  • 2019-12-03
                  • 2020-06-05
                  • 2020-08-22
                  相关资源
                  最近更新 更多