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

时间:2013-12-13 20:17:59

标签: powershell

我有一个监控图像文件夹的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窗口并在那里运行脚本,它就可以了。但是如果我在CMD提示符下运行它,

    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
    

15 个答案:

答案 0 :(得分:35)

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

第二个文件是计算机启动时需要执行的操作,只是将.ps1复制粘贴到启动文件夹将无法正常工作,因为它实际上并不执行脚本 - 它只打开文件用记事本。您需要执行.cmd,它本身将使用PowerShell执行.ps1。好吧,有足够的唠叨和步骤:

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

    C:\用户\< USER_NAME > \桌面\的 script.ps1

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

      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

      2. 这将做两件事:

        1. 将PowerShell的执行策略设置为Unrestricted。这是运行脚本所必需的,否则PowerShell将无法执行此操作。
        2. 使用PowerShell执行在指定路径中找到的.ps1脚本。
        3. 此代码专门针对PowerShell v1.0。如果你正在运行PowerShell v2.0,它可能会有所不同。在任何情况下,请检查this source以获取.cmd代码。

          1. 保存.cmd文件
          2. 既然您已经在各自的路径中使用了.ps1和.cmd文件,并且每个文件都有脚本,那么您已经完成了设置。

答案 1 :(得分:9)

您可以将其设置为预定任务,并为&#34;启动时设置任务触发&#34;

答案 2 :(得分:6)

我所做的是创建一个我放在shell中的快捷方式:startup。

快捷方式包含以下内容:

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

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

开始于:C:\scripts

(用包含脚本的文件夹替换脚本)

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

我有一个启动文件系统观察程序的脚本,但是一旦脚本窗口关闭,观察者就会死掉。如果我从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"

答案 5 :(得分:1)

您可以创建一个计划程序任务,即使用户未登录,该计划程序也会在开始时自动运行:

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"

答案 6 :(得分:1)

先决条件:

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 :(得分:1)

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

我知道“任务计划程序”是正确的方法,但是花了一些精力才能使其按我想要的方式运行,并认为我会将自己的发现发布给其他人。

问题包括:

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

注意:您必须具有运行脚本的权限,请参见ExecutionPolicy

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

应为Start a Program

程序/脚本:

powershell

添加参数(可选):

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

注意:

如果您在互联网上看到-File,它将起作用,但是除了文件路径IE,-File之后的所有内容都无法理解,即IE:重定向被视为文件路径的一部分,它失败,则必须将-command与重定向一起使用,但是可以在-windowstyle hidden之类的其他命令/参数之前添加前缀,以不显示PowerShell窗口。

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

答案 8 :(得分:0)

enter image description here,用于指定要在Windows启动时执行的Powershell脚本的相对较短的路径可能是:

  1. 单击Windows按钮(Windows按钮+ r)
  2. 输入此内容:
  

shell:启动

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

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

  

C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe -NoProfile-命令“ C:\ Users \ someuser \ Documents \ WindowsPowerShell \ Scripts \ somesscript.ps1”

请注意 -NoProfile 的使用 如果您在$ profile文件中进行了大量初始化,则将其加载到仅运行Powershell脚本的效率很低。 -NoProfile将跳过加载您的配置文件,并且如果不需要在执行Powershell脚本之前运行它,则可以很方便地指定它。

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

您可以在“启动”选项卡中的“任务管理器”中看到计划启动的脚本和更多内容。这是向计划的启动项目添加新项目的方法。

首先,通过开始按钮=>运行,将资源管理器打开到shell:启动位置。

  

explorer shell:启动

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

  

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

这将启动Powershell脚本,而无需启动$ profile脚本以加快执行速度。这将确保启动Powershell脚本。

shell:startup文件夹位于:

  

$ env:APPDATA \ Microsoft \ Windows

然后进入文件夹:

  

开始菜单\程序\启动

与往常一样,当路径包含空格时,Microsoft使我们感到有些麻烦,因此在这种情况下,您必须在完整路径周围加上引号,或者只需单击Powershell中的选项卡即可自动完成。

答案 11 :(得分:0)

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

PowerShell.exe -ExecutionPolicy Bypass

答案 12 :(得分:0)

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

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

很明显,如果您在 脚本(启动/关闭) 中拥有域名并放置了一个域,则制作GPO是最好的方法;在 计算机或用户配置\ Windows设置\脚本(启动/关闭) 下。 如果这样,请建立一个名为 Startup 或**

下的目录。

\\ yourdomain.com \ netlogon \

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

下找到它

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

因为这是 netlogon 的本地路径。

答案 13 :(得分:0)

执行下面的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。 如果不需要,请删除。

PS

如有必要,请执行以下PowerShell命令以启用PowerShell脚本执行。

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Unrestricted -Force;

Bypass -没有阻止,也没有警告或提示。

Unrestricted -加载所有配置文件并运行所有脚本。如果您运行从互联网下载的未签名脚本,则会在运行之前提示您获得许可。

答案 14 :(得分:0)

尝试一下。在启动文件夹和iuput中创建快捷方式

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

这是最简单的方法。