編程和設計人員最不喜歡遇到的老闆是怎樣的呢?那就是不斷變更需求的老闆。我最近就遇到了這樣一個難題:新的需求要求程序改動超過一半,工作量巨大,而且還要求在3天内完成修改。
過去,這幾乎是一個不可能完成的任務。
但現在,情況有了翻天覆地的變化。我利用AI輔助編程,僅用一晚上就搞定了。編寫程序是一項非常專業的工作。我接下來将以一個比較簡單的Windows腳本編程為例,來展示如何解決一個既不太大也不太小的問題。
有了AI的幫助,即使你的專業知識非常一般,甚至是完全沒有,也能夠完成這樣的任務。
這也是我今天在工作中碰到的一個難題。新的硬件設計中,我們增加了一塊電腦闆,這塊電腦闆能夠支持遠程登錄。這樣,我就可以在這塊電腦闆上編寫程序,然後将編譯好的程序直接刷入我們現場使用的控制闆中。
然而,問題來了:一旦接上這塊電腦闆,我們的控制闆就會随機性地重啟!這塊電腦闆是設計成開機自啟動的,這樣做的好處是,我可以在異地進行無人值守的登錄,無需親自前往現場出差,這無疑是一個降低人員出差成本的好辦法。
因此,我構思了一個解決方案:如果兩分鐘内我沒有登錄這塊電腦闆,它就會自動關機。如果需要再次開啟,可以請當地的同事幫忙啟動。因為調試機器并不是一直需要進行,隻有在增加新功能或修正問題時才必須運行。因此,預留兩分鐘的時間是完全足夠的。這樣也不會影響我們控制闆的正常運行。
為了實現這個方案,我需要編寫一個Windows的shell程序。但是,我對這方面的編程并不是特别擅長。
我記得以前,當我需要寫這種程序時,一邊查資料一邊調試代碼,通常需要3到5天才能完成。但現在,我僅用了一個下午就搞定了。
下面,我将詳細描述我解決這個問題的方法和過程。對于不感興趣或者不太喜歡看技術内容的讀者,可以選擇快速浏覽,不必深究細節。如果将來你遇到類似的需求,可以參考我的經驗,或者找一個懂計算機的朋友,讓他們參考我的教程來幫助你解決問題。
首先,我向AI提出了我的需求。注意提問的技巧,使用自然語言清楚地描述你的要求就可以了。我的目标是什麼,我想要實現什麼。當然,你也可以選擇分步驟、提示性地提問,隻是這樣可能需要更多的時間和更多的步驟。
我問:
編寫一個Windows shell程序,讓電腦在開機後2分鐘内,如果沒有操作,就自動關機,并且要求開機時自動運行此程序。
AI回答:
要實現這個功能,你可以通過編寫一個批處理腳本(Batch Script)來實現。這個腳本會在開機時自動運行,等待2分鐘,如果用戶沒有關閉指定的窗口,那麼就自動關機。這個過程涉及到幾個步驟:
編寫批處理腳本:這個腳本會等待2分鐘,然後檢查特定窗口是否還開着,如果開着就執行關機命令。
設置腳本開機自啟動:通過将腳本或其快捷方式放入Windows的"啟動"文件夾,或者通過任務計劃程序設置開機自啟動。
第1步:編寫批處理腳本
首先,需要明确你想要關閉的窗口是哪一個,因為批處理腳本需要根據窗口的标題來判斷。這裡以“記事本”(Notepad)為例。
創建一個新的文本文件,将其命名為AutoShutdown.bat,然後用文本編輯器打開它,輸入以下内容:
@echo off
timeout /t 120
tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 shutdown /s /f /t 0
這段腳本的意思是:
@echo off:不顯示後續執行的命令。
timeout /t 120:等待120秒(2分鐘)。
tasklist /fi "imagename eq notepad.exe":查找當前運行的程序中是否有記事本(notepad.exe)。
find ":" > nul:通過查找輸出中的":"來判斷上一個命令是否有輸出。
if errorlevel 1 shutdown /s /f /t 0:如果上一個命令的返回值(errorlevel)不是0(表示沒找到記事本),則執行關機操作。
第2步:設置腳本開機自啟動
有幾種方法可以設置腳本開機自啟動,這裡介紹通過“啟動”文件夾的方法:
按下Win+R鍵打開運行對話框,輸入shell:startup,然後按回車。這會打開“啟動”文件夾。
将你的AutoShutdown.bat文件的快捷方式複制到這個文件夾裡。
這樣,每次開機時,Windows就會自動運行這個腳本。
注意:自動關機可能會導緻用戶數據丢失,特别是如果用戶正在進行未保存的工作時。請确保用戶了解這一點,并且這個功能是真正需要的。此外,修改系統行為可能帶來意外的後果,所以在實施之前請确保充分測試。
額外說明
在實際應用中,你可能需要根據實際情況調整腳本,特别是tasklist /fi "imagename eq notepad.exe"這一行,其中的notepad.exe應該替換為你實際想要檢測的程序的進程名。
如果你想要檢測的是某個特定的窗口标題,而不是進程本身,可能需要使用更高級的腳本語言,如PowerShell,或者第三方工具,因為批處理的能力在這方面比較有限。
自動關機的功能可能會對用戶造成不便,确保這是你真正需要的功能,并且用戶已經被充分告知可能的後果。
如果你想要更複雜的邏輯(比如,在特定條件下取消關機),可能需要學習更多關于批處理腳本或PowerShell腳本的知識,或者考慮開發一個小型的應用程序來實現這些功能。
請在實施這些操作時謹慎行事,并确保你有足夠的權限來修改系統設置。
根據AI的回答,我發現,AI沒有完全理解我的問題,有點理解錯誤,因此我糾正這個錯誤。
我再問:
是檢查自己有沒有被關閉,或者說不用檢查自己被關閉,被用戶關閉就不關機。否則就關機。這個功能用于遠程鍊接,如果開機後兩分鐘内,沒有遠程鍊接并關閉這個窗口。windows就自動關機。保護windows強制關機造成的損壞。
小技巧:我的提問中有錯别字,但我沒有改正。我這樣做,也是提醒同樣用AI的朋友們,有一些錯字沒關系,當然沒錯更好。AI理解力還是很強的,有一定的自動糾錯能力。
AI回答:
了解您的需求後,我們可以稍微修改之前的腳本,使其在開機後2分鐘内檢查一個特定的條件是否滿足(在這個場景中是檢查一個特定的程序或窗口是否被關閉),如果滿足(即沒有遠程連接并關閉該窗口),則執行關機操作。這裡我們假設這個“窗口”是一個簡單的批處理腳本界面,當然,這個“窗口”可以是任何你用來作為遠程連接标志的程序。
第1步:創建标志窗口腳本
首先,我們創建一個簡單的批處理腳本,作為遠程連接的标志。當這個腳本運行時,它隻是打開一個命令提示符窗口,如果這個窗口在2分鐘内被關閉,那麼就不執行關機操作。我們将這個腳本命名為RemoteConnectionFlag.bat:
@echo off
echo Waiting for remote connection...
pause
第2步:編寫主腳本
然後,我們編寫主腳本,這個腳本會在開機時運行RemoteConnectionFlag.bat,等待2分鐘,然後檢查RemoteConnectionFlag.bat是否還在運行,如果還在運行,說明沒有遠程連接并關閉該窗口,就執行關機操作。我們将這個腳本命名為AutoShutdownIfNoRemote.bat:
@echo off
start "" "RemoteConnectionFlag.bat"
timeout /t 120
tasklist /fi "WindowTitle eq RemoteConnectionFlag.bat" |find ":" > nul
if errorlevel 1 shutdown /s /f /t 0
注意:這裡的WindowTitle eq RemoteConnectionFlag.bat可能需要根據實際情況進行調整,因為窗口标題可能會因為腳本的實際路徑或命令行解釋器的不同而有所不同。您可能需要手動檢查任務管理器中該腳本運行時的窗口标題,并相應地調整。
第3步:設置腳本開機自啟動
您可以通過将AutoShutdownIfNoRemote.bat腳本或其快捷方式放入Windows的"啟動"文件夾來實現開機自啟動,具體操作步驟如下:
按下Win+R鍵打開運行對話框,輸入shell:startup,然後按回車。這會打開“啟動”文件夾。
将AutoShutdownIfNoRemote.bat文件的快捷方式複制到這個文件夾裡。
這樣,每次開機時,Windows就會自動運行這個腳本,從而實現您的需求。
額外注意:
請确保在實施這些腳本之前進行充分測試,以避免意外的關機導緻工作丢失。
根據您的具體需求,可能需要調整腳本中的等待時間或其他邏輯。
如果您的遠程連接程序有特定的進程名或窗口标題,您可能需要對腳本進行相應的調整,以确保正确識别遠程連接的建立和斷開。
講解:其實AI也不是萬能的,AI隻是個輔助工具罷了,我是專家級程序員了,一眼就看出來這段解答中的問題。然後我就提醒AI改正。
我問:
有路徑問題吧?得指定執行RemoteConnectionFlag.bat的路徑吧?
AI很誠實外加謙虛的的回答:
是的,您提到了一個重要的點。如果RemoteConnectionFlag.bat不在同一個目錄下,或者該目錄未被包含在系統的環境變量PATH中,那麼在AutoShutdownIfNoRemote.bat腳本中直接調用RemoteConnectionFlag.bat可能會失敗,因為系統無法找到這個文件。為了解決這個問題,我們需要在調用RemoteConnectionFlag.bat時指定其完整的路徑。
修改後的AutoShutdownIfNoRemote.bat
假設RemoteConnectionFlag.bat位于C:\Scripts目錄下,那麼我們應該這樣修改AutoShutdownIfNoRemote.bat:
@echo off
start "" "C:\Scripts\RemoteConnectionFlag.bat"
timeout /t 120
tasklist /fi "WindowTitle eq RemoteConnectionFlag.bat" |find ":" > nul
if errorlevel 1 shutdown /s /f /t 0
這樣,不論RemoteConnectionFlag.bat位于哪個目錄,隻要你在AutoShutdownIfNoRemote.bat中提供了正确的完整路徑,系統就能夠找到并執行它。
注意,在使用tasklist /fi "WindowTitle eq RemoteConnectionFlag.bat"這條命令時,确保窗口标題正确無誤。實際上,窗口标題可能并不是腳本的文件名。你可能需要運行RemoteConnectionFlag.bat,然後在任務管理器中查看該批處理腳本打開的命令提示符窗口的确切标題,并據此調整AutoShutdownIfNoRemote.bat中的窗口标題過濾條件。
如果你的RemoteConnectionFlag.bat腳本不僅僅是打開一個窗口等待關閉,而是執行了一些其他操作(比如啟動一個用于遠程連接的程序),你可能需要根據實際情況調整AutoShutdownIfNoRemote.bat中的邏輯,以确保它能夠正确地判斷遠程連接是否已經建立。
通過這種方式,你可以确保無論RemoteConnectionFlag.bat位于系統的哪個目錄下,AutoShutdownIfNoRemote.bat都能夠正确地找到并執行它,從而實現在沒有建立遠程連接的情況下自動關機的功能。
講解:AI的這個解答确實能解決問題,但是我覺得還有更優化的解決方案,我提醒AI給我一個更好的解決方案。這種交互,是AI幫我解決問題,我也在幫AI提高智商。
我問:如果不檢測别人,隻檢測自己不也解決這個問題了麼?
AI回答:
确實,如果目标是檢測腳本自身是否在一定時間内被關閉(而不是檢測另一個程序或腳本),那麼可以簡化設計,無需檢查其他進程。這種方法可以直接應用于遠程連接場景,如果在指定時間内沒有人關閉該腳本(即沒有建立遠程連接),則自動執行關機。
這裡是一個簡化版的腳本,我們可以稱之為AutoShutdownIfNoAction.bat,它不需要檢測其他程序或腳本,隻需在開機後等待一定時間(例如2分鐘),如果在這段時間内腳本沒有被手動關閉,則自動執行關機操作:
@echo off
echo Waiting for remote connection or manual shutdown...
timeout /t 120 /nobreak > nul
echo No action detected, shutting down...
shutdown /s /f /t 0
如何工作:
腳本啟動時,會顯示一條消息提示等待遠程連接或手動關閉。
使用timeout命令等待指定時間(這裡是120秒,即2分鐘),/nobreak參數确保等待不能被鍵盤操作中斷。
如果在等待時間結束前,腳本沒有被關閉,那麼會顯示一條消息提示将要執行關機,并使用shutdown命令立即關機。
如何手動關閉腳本以防止關機:
用戶可以在等待時間結束前簡單地關閉命令提示符窗口,或者按Ctrl+C中斷腳本運行,以此來阻止腳本繼續執行關機命令。
設置腳本開機自啟動:
與之前相同,您可以将AutoShutdownIfNoAction.bat文件或其快捷方式添加到Windows的"啟動"文件夾,以實現開機自啟動。