在 Do...Until 内部调用时,应用程序不会从 Powershell 脚本触发
Application doesn't get triggered from Powershell script, when invoking inside Do...Until
我正在尝试构建自定义 Windows 系统实用程序脚本,它提供一些具有相关按键选择的任务。
对于清理任务,我正在尝试从此脚本调用 CCleaner64.exe,并使用 here 中提到的正确开关。到目前为止我构建的脚本如下:
$ScriptDir = Split-Path $MyInvocation.MyCommand.Path
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
$CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
Exit
}
}
Set-Location $ScriptDir; Echo 'Current Directory: ' + (Get-Location | Out-String)
function SysUtilMenu {
param (
[string]$Title = 'Windows System Utility'
)
Clear-Host
Write-Host "============ $Title ==========="
Write-Host "1: Do task 1 here."
Write-Host "2: Cache/Temp Files Cleanup."
Write-Host "Q: Exit this Application."
}
Do
{
SysUtilMenu
$selection = Read-Host "Press key to run given task..."
switch ($selection)
{
'1' {
## Do task 1 here...
} '2' {
$CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
Start-Process $CclnrApp64 -ArgumentList '/Clean'
Start-Process $CclnrApp64 -ArgumentList '/Registry'
}
}
}
Until($selection -eq 'q')
但是当我按“2”时,它不会在我检查过的任务栏中调用 CCleaner64.exe。
我不明白,为什么相同的 Start-Process
行在该脚本中不起作用,但是如果我单独打开 Powershell 终端并在 运行 下面逐条命令,效果很好吗?
$CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
Start-Process $CclnrApp64 -ArgumentList '/Clean'
是不是因为脚本的自提升,我已经注意设置脚本的位置而不是C:\Windows\System32
。
非常感谢提供详细解释的建议...
根据您添加的link,CCleaner 操作窗格焦点 的命令行参数下的文档说开关应该是/CLEANER
,而不是 /Clean
,并且由于您的代码还显示了开关 /Registry
,我认为这就是您想要的(在特定标签页上打开应用程序)。
我最初的想法是:
您可能需要添加 -Wait 开关,以便 PowerShell 仅在第一个命令完成后启动第二个命令。
所以完整的命令是 Start-Process -FilePath "$CclnrApp64" -ArgumentList '/Cleaner' -Wait
尝试使用 call 运算符 &
而不是像 & "$CclnrApp64" "/CLEANER"
这样的 Start-Process
以上两个变量 $CclnrApp64
中的路径都在引号之间,因为 $env:programfiles
通常会扩展为 C:\Program Files
,路径中有一个 space。
在 CCleaner 商业版和技术版的命令行参数 下,还有一个名为 /Clean
的开关
如果您有该版本,则开关应使用 ccleaner.ini 中定义的任何规则进行清理,并可选择将结果放入 log_filename.txt
但是,在同一个 CCleaner 页面上,还有一个其他参数列表,尤其是在命令行中使用的参数,并且您已经尝试使用 /AUTO
开关,看来这就是您想要的:
CCleaner 运行 会静默自动地使用当前保存的选项集来清理 PC。然后 CCleaner 退出。
关于 /AUTO
开关的注意事项:
当您 运行 CCleaner.exe 使用 /AUTO 参数时,CCleaner 不会 运行 注册表清理器。您目前无法通过命令行参数 运行 注册表清理器
所有这些意味着您可以将多个开关与 CCleaner 一起使用,但它们都有不同的用途。
/CLEANER
、/REGISTRY
、/TOOLS
和/OPTIONS
用于在某个窗格打开应用程序
/AUTO
(可选 /SHUTDOWN
)、/EXPORT
和 /DELETE
(可选 /METHOD
)是为了让应用程序执行 cleaning/delete 动作
商务和技术版还有
/analyze
、/clean
和 /update
我正在尝试构建自定义 Windows 系统实用程序脚本,它提供一些具有相关按键选择的任务。
对于清理任务,我正在尝试从此脚本调用 CCleaner64.exe,并使用 here 中提到的正确开关。到目前为止我构建的脚本如下:
$ScriptDir = Split-Path $MyInvocation.MyCommand.Path
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
$CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
Exit
}
}
Set-Location $ScriptDir; Echo 'Current Directory: ' + (Get-Location | Out-String)
function SysUtilMenu {
param (
[string]$Title = 'Windows System Utility'
)
Clear-Host
Write-Host "============ $Title ==========="
Write-Host "1: Do task 1 here."
Write-Host "2: Cache/Temp Files Cleanup."
Write-Host "Q: Exit this Application."
}
Do
{
SysUtilMenu
$selection = Read-Host "Press key to run given task..."
switch ($selection)
{
'1' {
## Do task 1 here...
} '2' {
$CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
Start-Process $CclnrApp64 -ArgumentList '/Clean'
Start-Process $CclnrApp64 -ArgumentList '/Registry'
}
}
}
Until($selection -eq 'q')
但是当我按“2”时,它不会在我检查过的任务栏中调用 CCleaner64.exe。
我不明白,为什么相同的 Start-Process
行在该脚本中不起作用,但是如果我单独打开 Powershell 终端并在 运行 下面逐条命令,效果很好吗?
$CclnrApp64 = "$Env:ProgramFiles\CCleaner\CCleaner64.exe"
Start-Process $CclnrApp64 -ArgumentList '/Clean'
是不是因为脚本的自提升,我已经注意设置脚本的位置而不是C:\Windows\System32
。
非常感谢提供详细解释的建议...
根据您添加的link,CCleaner 操作窗格焦点 的命令行参数下的文档说开关应该是/CLEANER
,而不是 /Clean
,并且由于您的代码还显示了开关 /Registry
,我认为这就是您想要的(在特定标签页上打开应用程序)。
我最初的想法是:
您可能需要添加 -Wait 开关,以便 PowerShell 仅在第一个命令完成后启动第二个命令。
所以完整的命令是Start-Process -FilePath "$CclnrApp64" -ArgumentList '/Cleaner' -Wait
尝试使用 call 运算符
这样的 Start-Process&
而不是像& "$CclnrApp64" "/CLEANER"
以上两个变量 $CclnrApp64
中的路径都在引号之间,因为 $env:programfiles
通常会扩展为 C:\Program Files
,路径中有一个 space。
在 CCleaner 商业版和技术版的命令行参数 下,还有一个名为 /Clean
的开关
如果您有该版本,则开关应使用 ccleaner.ini 中定义的任何规则进行清理,并可选择将结果放入 log_filename.txt
但是,在同一个 CCleaner 页面上,还有一个其他参数列表,尤其是在命令行中使用的参数,并且您已经尝试使用 /AUTO
开关,看来这就是您想要的:
CCleaner 运行 会静默自动地使用当前保存的选项集来清理 PC。然后 CCleaner 退出。
关于 /AUTO
开关的注意事项:
当您 运行 CCleaner.exe 使用 /AUTO 参数时,CCleaner 不会 运行 注册表清理器。您目前无法通过命令行参数 运行 注册表清理器
所有这些意味着您可以将多个开关与 CCleaner 一起使用,但它们都有不同的用途。
/CLEANER
、/REGISTRY
、/TOOLS
和/OPTIONS
用于在某个窗格打开应用程序/AUTO
(可选/SHUTDOWN
)、/EXPORT
和/DELETE
(可选/METHOD
)是为了让应用程序执行 cleaning/delete 动作
商务和技术版还有
/analyze
、/clean
和/update