103

I have a PowerShell script that monitors an image folder. I need to find a way to automatically run this script after the computer starts.

I already tried the following methods, but I couldn't get it working.

  1. Use msconfig and add the PowerShell script to startup, but I cannot find the PowerShell script on that list.

  2. Create a shortcut and drop it to startup folder. No luck.

    %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
    

    or

    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
    

    Here's my PowerShell script:

    $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"
    

    It will not work. I am not sure it's a permission problem or something else.

    BTW, I have PowerShell 3.0 installed, and if I type $host.version, it will show 3 there. But my powershell.exe seems like it is still v1.0.

    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
    
3
  • v1.0 powershell.exe is the v3. MSFT is just lazy with moving files to new folders for new versions. i.e. System32 on x64 is x64 and syswow64 is 32 bit. Commented Dec 15, 2013 at 13:04
  • do you really need to double up the first few lines 'c:\\doc\\files', why not c:\doc\files ? Commented Dec 15, 2013 at 13:08
  • I found this maybe it ll help someone else jd-bots.com/2021/05/15/… Commented Jun 17, 2022 at 18:30

17 Answers 17

95

I finally got my PowerShell script to run automatically on every startup. You will need to create two files: the first is the Powershell script (e.g. script.ps1) and the second is a .cmd file that will contain commands that will run on the command prompt (e.g. startup.cmd).

The second file is what needs to be executed when the computer starts up, and simply copy-pasting the .ps1 to the startup folder won't work, because that doesn't actually execute the script - it only opens the file with Notepad. You need to execute the .cmd which itself will execute the .ps1 using PowerShell. Ok, enough babbling and on to the steps:

  1. Create your .ps1 script and place it in a folder. I put it on my desktop for simplicity. The path would look something like this:

%USERPROFILE%\Desktop\script.ps1

  1. Create a .cmd file and place it in

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

Doing this will execute the cmd file every time on startup. Here is a link of how to create a .cmd file if you need help.

  1. Open the .cmd file with a text editor and enter the following lines:
PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell %USERPROFILE%\Desktop\script.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

This will do two things:

  1. Set the Execution Policy of your PowerShell to Unrestricted. This is needed to run scripts or else PowerShell will not do it.
  2. Use PowerShell to execute the .ps1 script found in the path specified.

This code is specifically for PowerShell v1.0. If you're running PowerShell v2.0 it might be a little different. In any case, check this source for the .cmd code.

  1. Save the .cmd file

Now that you have your .ps1 and .cmd files in their respective paths and with the script for each, you are all set.

Sign up to request clarification or add additional context in comments.

7 Comments

For me it executes the command only when the Administrator user logs in, and not in every system startup, as I would expect
@ThiagoAlves As an administrator, find the "Startup" folder in the Start Menu, right click on it, then click "Open All Users." Place your script .cmd there, and it should run whenever any user logs in. This is not the same as running on startup (i.e. before any user logs in), but is most likely close enough.
@ThiagoAlves If the logged in user is not Administrator add CurrentUser (do not substitute your username) to the end of the first command... like this: PowerShell -Command "Set-ExecutionPolicy Unrestricted CurrentUser"
@DanRoss this still didn't work for me. I'm on an AWS EC2 Microsoft Windows Server 2019 Base - ami-0bbdf9279190cdd33. My task runs, but only after I RDP into the instance.
So many upvotes for an answer that runs something when a user logs in, NOT when at the logon prompt (a.k.a "when the PC starts")...
|
25

What I do is create a shortcut that I place in shell:startup.

The shortcut has the following:

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

(replacing scripts\scripts.ps1 with what you need)

Start In: C:\scripts

(replacing scripts with folder which has your script)

6 Comments

Had troubles getting that to work. I then realized that I didn't specify "Start In". After setting that (as per your answer), it worked. Thanks.
This pops up a powershell window, which is exactly what I wanted.
Where and what is "shell:startup" and "Start In: C:\scripts"? thanks
@TimothyL.J.Stewart When you view properties of a shortcut, there is a "Start in" option, you add the folder your script is in there. Shell:startup can be opened by opening Run (Win+R) and typing in shell:startup
This runs when I manually log in, not when the VM starts up :-(
|
24

You could set it up as a Scheduled Task, and set the Task Trigger for "At Startup"

6 Comments

Be sure to Set-ExcutionPolicy Elevated to RemoteSigned or preference of your choice. Then your method of " %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1" " should work.
still not working, is this correct? powershell.exe -ExecutionPolicy unrestricted -File "C:\Doc\Files\FileMonitor.ps1"
I believe you'll also need to specify -NoExit so it continues to run, otherwise it's just going to register the event and then exit, taking the event registration down with it.
make sure you check the box that allows it to run when no user is logged in .
This is the correct answer, but I expanded on it w/ a few issues I ran into during implementation see --> stackoverflow.com/a/64096259/5079799
|
18

You could create a Scheduler Task that runs automatically on the start, even when the user is not logged in:

schtasks /create /tn "FileMonitor" /sc onstart /delay 0000:30 /rl highest /ru system /tr "powershell.exe -file C:\Doc\Files\FileMonitor.ps1"

Run this command once from a PowerShell as Admin and it will create a schedule task for you. You can list the task like this:

schtasks /Query /TN "FileMonitor" /V /FO List

or delete it

schtasks /Delete /TN "FileMonitor"

2 Comments

Documentation for the scheduled tasks command can be found here: learn.microsoft.com/en-us/windows/desktop/taskschd/schtasks
I used this same format to start a .cmd. schtasks /create /tn "FileMonitor" /sc onstart /delay 0000:30 /rl highest /ru system /tr "C:\Program Files\MyTools\Mycmd.cmd"
13

This is really just an expansion on @mjolinor simple answer [Use Task Scheduler].

I knew "Task Scheduler" was the correct way, but it took a bit of effort to get it running the way I wanted and thought I'd post my finding for others.

Issues including:

  • Redirecting output to logs
  • Hiding the PowerShell window

Note: You must have permission to run script see ExecutionPolicy

Then in Task Scheduler, the most important/tricky part is the Action

It should be Start a Program

Program/Script:

powershell

Add arguments (optional) :

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

Note:

If you see -File on the internet, it will work, but understand nothing can be after -File except the File Path, IE: The redirect is taken to be part of the file path and it fails, you must use -command in conjunction with redirect, but you can prepend additional commands/arguments such as -windowstyle hidden to not show PowerShell window.

I had to adjust all Write-Host to Write-Output in my script as well.

1 Comment

My mistake was clicking "Change User or Group..." and setting it to admin which succeeds but never actually would launch the program it seemed. The default user did work, once I tried it!
9

Try this: create a shortcut in startup folder and input

PowerShell "& 'PathToFile\script.ps1'"

This is the easiest way.

2 Comments

I had to remove the '.' after the '&', for it to work.
The syntax you are using is meaningless and won't work. It's either PowerShell 'PathToFile\script.ps1' or PowerShell -File 'PathToFile\script.ps1'. & is used to run commands, so it can also be PowerShell -Command "& 'PathToFile\script.ps1'", but it makes no sense for merely running a script.
4

Prerequisite:

1. Start powershell with the "Run as Administrator" option

2. Enable running unsigned scripts with:

set-executionpolicy remotesigned

3. prepare your powershell script and know its path:

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

Steps:

1. setup a trigger, see also New-JobTrigger (PSScheduledJob) - PowerShell | Microsoft Docs

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

2. register a scheduled job, see also Register-ScheduledJob (PSScheduledJob) - PowerShell | Microsoft Docs

Register-ScheduledJob -Trigger $trigger -FilePath $path -Name MyScheduledJob

you can check it with Get-ScheduledJob -Name MyScheduledJob

3. Reboot Windows (restart /r) and check the result with:

Get-Job -name MyScheduledJob

see also Get-Job (Microsoft.PowerShell.Core) - PowerShell | Microsoft Docs

References:

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

Comments

3

Copy ps1 into this folder, and create it if necessary. It will run at every start-up (before user logon occurs).

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

Also it can be done through GPEDIT.msc if available on your OS build (lower level OS maybe not).

1 Comment

I have copied my ps1 file to the above folder. It is not working for me... do u have any idea, what could be the reason?
3

Be sure, whenever you want PowerShell to run automatically / in the background / non-interactive, it’s a good idea to specify the parameters -ExecutionPolicy Bypass to PowerShell.exe

PowerShell.exe -ExecutionPolicy Bypass

Comments

2

One thing I found. if you are using Write-Host within your PowerShell scripts, and are also using Task Scheduler (as shown in the posts above), you don't get all the output from the command line.

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

In my case, I was only seeing output from commands that ran successfully from the PowerShell script.

My conclusion so far is PowerShell uses Out-File to output to another command or in this case a log file.

So if you use *> instead of >> you get all the output from the CLI for your PowerShell script, and you can keep using Write-Host within your script.

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

https://lazyadmin.nl/powershell/output-to-file/

You can also run the script in the background, regardless of user login.

Within your task in Task Scheduler set "Run whether user is logged on or not", and then in the password prompt type your hostname\username then your password (In my case an account with Admin permissions).

I used Set-ExecutionPolicy RemoteSigned -Scope CurrentUser to get around the script execution problem. I still would have preferred to run it on a per-process basis though. A problem for another time.

Comments

1

I have a script that starts a file system watcher as well, but once the script window is closed the watcher dies. It will run all day if I start it from a powershell window and leave it open, but the minute I close it the script stops doing what it is supposed to.
You need to start the script and have it keep powershell open.
I tried numerous ways to do this, but the one that actually worked was from 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
}

Pasting that to the top of the script is what made it work.
I start the script from command line with

powershell.exe -noexit -command "& \path\to\script.ps1"

1 Comment

The 'methos-it' link is dead. Do you have an alternate?
0

enter image description hereA relatively short path to specifying a Powershell script to execute at startup in Windows could be:

  1. Click the Windows-button (Windows-button + r)
  2. Enter this:

shell:startup

  1. Create a new shortcut by rightclick and in context menu choose menu item: New=>Shortcut

  2. Create a shortcut to your script, e.g:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "C:\Users\someuser\Documents\WindowsPowerShell\Scripts\somesscript.ps1"

Note the use of -NoProfile In case you put a lot of initializing in your $profile file, it is inefficient to load this up to just run a Powershell script. The -NoProfile will skip loading your profile file and is smart to specify, if it is not necessary to run it before the Powershell script is to be executed.

Here you see such a shortcut created (.lnk file with a Powershell icon with shortcut glyph):

Comments

0

This worked for me. Created a Scheduled task with below details: Trigger : At startup

Actions: Program/script : powershell.exe Arguments : -file

Comments

0

You can see scripts and more scheduled for startup inside Task Manager in the Startup tab. Here is how to add a new item to the scheduled startup items.

First, open up explorer to shell:startup location via start-button => run:

explorer shell:startup

Right click in that folder and in the context menu select a new shortcut. Enter the following:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "C:\myfolder\somescript.ps1"

This will startup a Powershell script without starting up your $profile scripts for faster execution. This will make sure that the powershell script is started up.

The shell:startup folder is in:

$env:APPDATA\Microsoft\Windows

And then into the folder:

Start Menu\Programs\Startup

As usual, Microsoft makes things a bit cumbersome for us when a path contains spaces, so you have to put quotes around the full path or just hit tab inside Powershell to autocomplete in this case.

Comments

0

If you do not want to worry about execution policy, you can use the following and put into a batch script. I use this a lot when having techs at sites run my scripts since half the time they say script didnt work but really it's cause execution policy was undefined our restricted. This will run script even if execution policy would normally block a script to run.
If you want it to run at startup. Then you can place in either shell:startup for a single user or shell:common startup for all users who log into the PC.

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

Obviously, making a GPO is your best method if you have a domain and place in Scripts (Startup/Shutdown); under either Computer or User Configurations\Windows Settings\Scripts (Startup/Shutdown). If you go that way make a directory called Startup or something under **

\\yourdomain.com\netlogon\

and put it there to reference in the GPO. This way you know the DC has rights to execute it. When you browse for the script on the DC you will find it under

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

since this is the local path of netlogon.

Comments

0

Execute PowerShell command below to run the PowerShell script .ps1 through the task scheduler at user login.

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 - indicates that a trigger starts a task when a user logs on.

-AtStartup - indicates that a trigger starts a task when the system is started.

-WindowStyle Hidden - don't show PowerShell window at startup. Remove if not required.

-RunLevel Highest - run PowerShell as administrator. Remove if not required.

P.S.

If necessary execute PowerShell command below to enable PowerShell scripts execution.

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

Bypass - nothing is blocked and there are no warnings or prompts.

Unrestricted - loads all configuration files and runs all scripts. If you run an unsigned script that was downloaded from the internet, you're prompted for permission before it runs.

Comments

-1

enter image description here

I'm aware that people around here don't need a tool like this, but I think it will be useful especially for novice users. Auto Start Tool is a portable freeware designed to simplify the process of automatically launching an app or script when you log in to Windows. It offers three different options for autostart:

  1. Task Scheduler
  2. Startup Folder
  3. Registry Run Key

The best part of the tool is that it supports PowerShell scripts (.ps1), which means you can run a PowerShell script automatically at system startup using any of the three available methods.

Download: https://disk.yandex.com.tr/d/dFzyB2Fu4lC-Ww

Source: https://www.portablefreeware.com/forums/viewtopic.php?f=4&t=25761

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.