如何检测批处理文件是否通过Windows启动事件调用PowerShell脚本

3

有一个批处理文件调用了一个PowerShell脚本,我已经在Windows启动文件夹中创建了一个指向该批处理文件的快捷方式,因此每次Windows启动时都会运行PowerShell脚本。我想知道我的PowerShell脚本如何在运行时检测它是否是由批处理文件在Windows启动事件期间调用的,还是由用户手动运行批处理文件调用的。

3个回答

2
如果用户只会直接运行批处理文件而不通过启动快捷方式运行,那么您可以设置启动快捷方式在运行时向批处理传递参数。
右键单击快捷方式并选择属性。在目标字段中添加一个空格,然后添加“1”。
例如,如果它是“C:\ MyDir \ MyScript.bat”,则将其更改为“C:\ MyDir \ MyScript.bat 1”。
当您运行此快捷方式时,它将启动批处理文件,并在变量%1中传递值1。
接下来,在批处理文件的顶部(或任何您想要的位置)添加以下内容。
@echo off
if "%1"=="1" (
   echo Hey I'm running at startup
)

你可以将echo行替换为你想要运行的命令,如果批处理文件是从启动快捷方式运行的。

顺便提一下... 在批处理中,%1 中的值无法在 call 过程中保留。如果您需要在 call 内部使用 %1 的值,则需要首先将其设置为您选择的变量,然后再使用该变量。也就是说,执行 set var1=%1 - Durry42

0

试试这个:

@echo off
wmic startup get command | find "%~f0" >nul && (
  echo I am running at startup!
)

它使用wmi类Win32_StartupCommand(在wmic中别名为startup)来检查bat文件是否在启动时运行。


0
计划A:从用户中删除该选项。从其运行键启动.bat文件。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
计划B:如果需求复杂,可以使用。
# The time the script was ran
$runtime = get-date

# Starts when the user logs on
$LogonTime = (Get-Process explorer)[0].starttime

$differenceTime = New-TimeSpan -Start $logontime -End $runtime

If ($differenceTime.TotalMinutes -lt 1) {
    White-host "$env:USERNAME did not run it"
}
Else {
    Write-host "$env:USERNAME did run it"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接