计算机启动时如何运行 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. I also tried to add a basic task using taskschd.msc. It is still not working.

    Here's what I found, and maybe that will help to debug it.

    If I open up a PowerShell window and run the script there, it works. But if I run it in a command prompt,

    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
    
226828 次浏览

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

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

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

也可以通过 GPEDIT.msc 完成,如果可以在你的操作系统构建(低级别的操作系统可能不行)。

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

第二个文件是计算机启动时需要执行的内容,只需复制粘贴。Ps1到启动文件夹不起作用,因为它实际上不执行脚本——它只用记事本打开文件。您需要执行。Cmd,它本身将执行。使用 PowerShell 的 ps1。好了,废话少说,上台阶吧:

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

% 用户配置文件% 桌面 Script.ps1

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

% AppData% MicrosoftWindows 启动菜单程序启动 Startup.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 文件在各自路径中的位置以及每个路径的脚本,都已经设置好了。

我有一个脚本,启动一个文件系统监视器以及,但一旦脚本窗口关闭,监视器死亡。如果我从一个 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"

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

捷径如下:

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

(使用所需内容替换脚本 scripts.ps1)

C:\scripts开始

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

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-Command“ C: Usersomuser Document WindowsPowerShell Scripts somesscript.ps1”

注意 < strong >-NoProfile 的用法 如果您在 $profile 文件中进行了大量初始化,那么仅仅运行 Powershell 脚本来加载该文件是效率低下的。NoProfile 将跳过加载概要文件的步骤,并且如果在执行 Powershell 脚本之前不需要运行它,那么可以明智地进行指定。

在这里您可以看到这样一个创建的快捷方式(. ink 文件,带有带有快捷标志符号的 Powershell 图标) :

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

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

您可以在“启动”选项卡中的“任务管理器”中看到启动脚本和更多计划。下面介绍如何向计划启动项添加新项。

首先,通过 start-Button = > run 打开资源管理器到 shell: 启动位置:

启动

右键单击该文件夹并在上下文菜单中选择一个新的快捷方式:

C: Windows System32 Windows PowerShell v1.0 powershell.exe-NoProfile - 命令“ C: myfile somescript. ps1”

这将启动一个 Powershell 脚本,而不需要启动 $profile 脚本来加快执行速度。这将确保 Powershell 脚本已经启动。

启动文件夹位于:

$env: APPDATA Microsoft Windows

然后进入文件夹:

启动菜单程序

和往常一样,当一个路径包含空格时,微软会让事情变得有点麻烦,所以你必须在整个路径周围加上引号,或者在 Powershell 内部点击 tab 来自动完成。

您可以创建一个在启动时自动运行的计划程序任务,即使用户没有登录:

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"

请确保,每当您希望 PowerShell 自动/在后台/非交互式环境下运行时,指定参数是一个好主意 -ExecutionPolicy Bypass到 PowerShell.exe

PowerShell.exe -ExecutionPolicy Bypass

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

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

显然,如果在 脚本(启动/关闭)中有一个域和位置,在 < em > 计算机或用户配置 Windows 设置脚本(启动/关闭) 下创建 GPO 是最好的方法。 如果你这样做,使一个目录称为 启动或下的东西 * *

Youdomain.com 上网登录

并把它放在 GPO 中作为参考。这样你就知道华盛顿特区有权执行。当您浏览 DC 上的脚本时,您会发现它位于

C: WindowsSYSVOL 域脚本启动

因为这是 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 窗口。 < strong > 如果不需要则删除。

-RunLevel Highest -以管理员身份运行 PowerShell。 < strong > 删除(如果不需要)。

附言。

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

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

Bypass -没有阻塞任何内容,也没有警告或提示。

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

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

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

这是最简单的方法。

先决条件:

1. 使用“ Run as Administrator”选项启动 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

注册一个预定的作业,参见 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. 如何启用 PowerShell 脚本的执行?-超级用户
  2. 使用 PowerShell 创建在启动时运行的作业 | 脚本博客

这实际上只是对 @ mjolinor 简单的回答[使用任务计划程序]的扩展。

我知道“任务计划程序”是 正确的方式,但它需要一点努力,让它以我想要的方式运行,并认为我会为其他人发布我的发现。

问题包括:

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

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

然后在任务调度器中,最重要/最棘手的部分是 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-HostWrite-Output在我的脚本以及。

enter image description here

我知道这里的人不需要这样的工具。但我认为它对新手用户尤其有用。自动启动工具这是一个便携式免费软件,旨在简化过程中自动启动应用程序或脚本时,你登录到 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,并且也在使用 Task Scheduler (如上面的文章所示) ,则不会从命令行获得所有输出。

powershell.exe -command C:\scripts\script.ps1 >> "C:\scripts\logfile.log"

在我的例子中,我只看到从 PowerShell 脚本中成功运行的命令的输出。

到目前为止,我的结论是 PowerShell 使用 Out-File 输出到另一个命令,在本例中是一个日志文件。

因此,如果使用 * > 而不是 > > ,就可以从 PowerShell 脚本的 CLI 中获得所有输出,并且可以在脚本中继续使用 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来解决脚本执行问题。尽管如此,我仍然希望在每个进程的基础上运行它。下次再说吧。