請問懂BAT檔的大哥大姐們,請教一下
開機時會啟動一個cmd檔,要求輸入Enter 才會接下去執行其它連網功能
現在不知道這個cmd檔名和標題名稱是什麼情況下
只知道它開機時會自動縮小視窗在工作列
我要寫另一個BAT檔或是 PowerShell 把這個開機啟動縮小在工作列的cmd給放大在前置作業
然後輸入enter命令到開機啟動這個cmd,要怎麼寫
目前寫成這樣無法成功
@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('tasklist /fi "imagename eq cmd.exe" /v /fo list') do (
set "output=!output!%%a"
)
set "title="
for /f "tokens=1,* delims=:" %%a in ('echo !output! ^| findstr /i /c:"Window Title"') do (
set "title=%%b"
)
if defined title (
echo CMD window found with title: !title!
start "" /wait cmd /c "mode con: cols=80 lines=25 && title !title! && pause > nul && exit"
echo Simulating Enter key...
powershell -command "[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')"
) else (
echo No CMD windows found in the taskbar.
)
.cmd
修正 echo Done;
位置。.cmd
增加除錯用顯示控制功能。現在不知道這個cmd檔名和標題名稱是什麼情況下
只知道它開機時會自動縮小視窗在工作列
正常應該是能在工作列看到視窗標題的啊, 你的 Windows 是啥特殊狀況?
你的 Cmd-script 有些詭異的命令讓我看無, 所以我就用自己的方式寫「範例」給你「參考」。
命令提示字元
), 須注意, .bat/.cmd
存檔的字元編碼須配合 Win-Cmd 環境的字碼頁(CodePage)。if not "!myTitleStr!"=="N/A" (...)
濾除空白標題(N/A
)~ )for /f "tokens=*" %%G in ('tasklist ...
命令,會呼叫空白標題的 cmd.exe
以處理 tasklist /fi "imagename eq ...
命令; 這流程會影響 「空白標題 cmd.exe
」 的搜尋結果, 請注意。 )@echo off
@rem ## This is a '.cmd' file;
@rem chcp 65001
@rem ## chcp-enum: 65001:UTF-8; 950:Big5;
@rem ## 如果目標程式的視窗標題含中文字元 (例如:`命令提示字元`),
@rem ## 須注意 `.bat/.cmd` 存檔的字元編碼須配合 Win-Cmd 環境的字碼頁(CodePage)。
setlocal enabledelayedexpansion
@rem ## myDbgPrt: 顯示除錯用資訊; Char#1: !myTitleStr!; Char#2: !myPSCmd!;
set "myDbgPrt=00"
@rem ## myFilterStr: 篩選用字串; (不篩選, 我只覺得危險~)
set "myFilterStr=提示"
@rem ## 以 tasklist 搜尋所有 cmd.exe; 以 findstr 擷取含 "Window Title" 的單行字串;
for /f "tokens=*" %%G in ('tasklist /fi "imagename eq cmd.exe" /v /fo list ^| findstr /i /c:"Window Title"') do (
set "myTitleStr=%%~G"
if [%myDbgPrt:~0,1%]==[1] @echo DbgPrt:myTitleStr:0:[!myTitleStr!]
@rem ## 移除 "Window Title: " 以截取視窗標題字串(視必要請自行修改下一行);
set "myTitleStr=!myTitleStr:Window Title: =!"
if [%myDbgPrt:~0,1%]==[1] @echo DbgPrt:myTitleStr:1:[!myTitleStr!]
if not "!myTitleStr!"=="N/A" (
@rem ## filter-out: "N/A"; 遇到沒標題的字串時略過, 其他繼續;
if [%myDbgPrt:~0,1%]==[1] @echo DbgPrt:myTitleStr:2:[!myTitleStr!]
if not "!myTitleStr:%myFilterStr%=!"=="!myTitleStr!" (
@rem ## 遇到含有 "%myFilterStr%" 的標題字串時繼續, 其他略過;
if [%myDbgPrt:~0,1%]==[1] @echo DbgPrt:myTitleStr:3:[!myTitleStr!]
@rem ## Setup: Cmd for powershell.exe; 建立給 PowerShell (PS)用的命令;
@rem ## PS-Cmd: 初始化 WScript.Shell 物件給 $wshs;
set "myPSCmd=$wshs=New-Object -ComObject WScript.Shell"
@rem ## PS-Cmd: 激活標題為 !myTitleStr! 的程式為前景;
set "myPSCmd=!myPSCmd!;$wshs.AppActivate('!myTitleStr!')"
@rem ## PS-Cmd: 暫停 0.1 秒;
set "myPSCmd=!myPSCmd!;Start-Sleep 0.1"
@rem ## PS-Cmd: 發送 Enter 觸發訊號給前景程式;
set "myPSCmd=!myPSCmd!;$wshs.SendKeys('{Enter}')"
if [%myDbgPrt:~1,1%]==[1] @echo DbgPrt:myPSCmd:[!myPSCmd!]
echo Run:[!myTitleStr!];
@rem ## 丟 myPSCmd 命令字串給 powershell.exe 執行;
powershell -Command "&{!myPSCmd!}"
)
)
)
echo Done;
以下 PowerShell (Tested@pwsh.exe-v7) 的 script:
( 不管是 powershell.exe
還是 pwsh.exe
都方便好用、 檔案字元編碼問題也少~ 只是程序體積比 cmd.exe
肥大~ )
( 範例中多餘或不同的程式碼, 是用以展示做同一件事的另個實作方法。 )
## This is a '.ps1' file;
#$myWSHS = New-Object -ComObject WScript.Shell
@(
'Microsoft.VisualBasic',
'System.Windows.Forms'
) |% {
#[void][System.Reflection.Assembly]::LoadWithPartialName($_)
Add-Type -AssemblyName $_
}
Get-Process -Name 'cmd' |? {
## 篩選視窗標題符合 -like '*提示*' 的程序;
$_.MainWindowTitle -like '*提示*'
} |% {
Write-Host ('Run:[' + $_.Id + ']:[' + $_.MainWindowTitle + ']')
#$myWSHS.AppActivate($_.Id)
## https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.interaction.appactivate
[Microsoft.VisualBasic.Interaction]::AppActivate($_.Id)
Start-Sleep 0.1
#$myWSHS.SendKeys('{Enter}')
## https://learn.microsoft.com/dotnet/api/system.windows.forms.sendkeys.sendwait
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')
} |Out-Null
Write-Host ('Done;')