iT邦幫忙

2

開機啟動cmd檔

  • 分享至 

  • xImage

請問懂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.
)

ccutmis iT邦高手 2 級 ‧ 2023-03-17 22:56:08 檢舉
改用 python 的話 我知道怎麼做
用 cmd 我不知道
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
re.Zero
iT邦研究生 5 級 ‧ 2023-03-18 20:34:25
最佳解答

Update

  • .cmd 修正 echo Done; 位置。
  • .cmd 增加除錯用顯示控制功能。

現在不知道這個cmd檔名和標題名稱是什麼情況下
只知道它開機時會自動縮小視窗在工作列

正常應該是能在工作列看到視窗標題的啊, 你的 Windows 是啥特殊狀況?

https://ithelp.ithome.com.tw/upload/images/20230318/20155649Oanf3PaoGr.png

你的 Cmd-script 有些詭異的命令讓我看無, 所以我就用自己的方式寫「範例」給你「參考」。

  • 因為你似乎想要遍歷 cmd.exe, 所以寫個遍歷版本的。
  • 如果目標程式的視窗標題含中文字元 (例如:命令提示字元), 須注意, .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;')
kkbox iT邦新手 5 級 ‧ 2023-03-20 20:40:50 檢舉

因為是在公司登入時會有一個cmd執行網路連接開通,看不到標題,也有點煩...想做一個BAT把讓他執行然後關閉,在去做一些我平常想做的事...哈哈哈,謝謝您的幫忙~

re.Zero iT邦研究生 5 級 ‧ 2023-03-21 22:32:29 檢舉

看不到標題

真這麼麻煩喔~ 有幫上忙就好~ XD

我要發表回答

立即登入回答