一個神奇的腳本,一鍵運行各類程序(for Notepad++)

2021-12-21 數據挖掘機養成記

【原創,轉載請註明來自公眾號『數據挖掘機養成記』】

前言

一年前,我在公眾號裡寫過一篇文章 『windows下用Notepad++開發Python、C/C++』,大概講了如何用notepad++內置的運行命令來編譯運行相應程序,現在看來,略顯簡陋了

如今,我將分享一個前陣子琢磨了一整天寫的 notepad++ 腳本給大家,可以一鍵編譯或運行Python/C/C++/Java 程序,理論上還可以根據你的需要擴展到更多語言

談談編輯器與IDE

在進入正題前,先聊聊開發環境,各位根據實際情況選擇是否真的要用notepad++做開發(P.S. notepad++打開文本文件的速度還是相當快的,即便不用它做開發,用來打開文件也是極好的)
一般而言,開發環境無非兩類,編輯器(如notepad++、sublime、vim、emacs)和IDE (如IDEA、Eclipse、VisualStudio、Pycharm),談談我對這兩者的理解:

恰逢七夕,若以戀愛做比,編輯器就是一個單純又不諳世事的少女,你得手把手「調教」她,告訴她你需要什麼,挖掘她的潛力,而「調教」的過程也會給你帶來莫大的成就感;IDE則是八面玲瓏的交際花,會察言觀色,能猜到你的心思,你只需稍加點撥,她便可助你直上青雲。

所以,我建議: 初學者可以先嘗試用編輯器,熟悉語言的語法、編譯和運行方式,打下基礎,也可以用來快速測試一些簡單碎片化的代碼;但如果開發比較大型的項目,尤其是需要同步協作的時候,還是用IDE更便捷且穩定高效。

鑑於不少網站私自爬取我的原創文章,我決定在文中插入二維碼以維護來源,希望不會打擾到各位閱讀


腳本安裝和運行

以下操作皆在notepad++中進行,所以請先安裝notepad++

Step 1. 安裝NppExec插件

notepad++菜單欄->插件->plugin manager->show plugin manager,點擊進入,找到Nppexec,安裝。安裝成功後重啟notepad++,會在菜單欄->插件中出現NppExec

Step 2. 腳本:判斷文件是否存在

這個腳本的功能是判斷文件是否存在。在之前,我一直以為NppExec的語法跟Windows的DOS一樣,但看了文檔後發現它只支持很少的DOS指令。所以在DOS中一句IF EXIST就可以完成的功能,在NppExec中需要自己寫

本節參考https://sourceforge.net/p/npp-plugins/discussion/672146/thread/e3275948/,具體地:點擊 notepad++菜單欄->插件->NppExec->Excute,在腳本編輯框中輸入以下代碼:

set FILEEXISTS = 0npe_console v+cmd /c if exist $(ARGV) echo Existsif "$(OUTPUTL)" != "Exists" goto ...set FILEEXISTS = 1:...npe_console v-

點擊下面按鈕保存腳本,起一個名字叫CheckFileExists

Step 3. 腳本:編譯和運行

高潮來了,接下來這個腳本是我在通讀NppExec文檔基礎上完全自己造的輪子,可以針對不同後綴名的程序文件,執行不同的編譯和運行操作,目前支持Python/C/C++/Java,可自行擴展。

跟上一節一樣,先進入NppExec的腳本編輯框,輸入以下代碼(有興趣的可以看代碼注釋,方便以後自己擴展)

npp_console disable // 關閉顯示,否則執行時腳本時會在console窗口顯示每條腳本語句,有礙觀感cd "$(CURRENT_DIRECTORY)"if $(EXT_PART) == .java goto javaif $(EXT_PART) == .py goto pythonif $(EXT_PART) == .cpp goto cppif $(EXT_PART) == .c goto cgoto error1 // 當非c/c++/python/java文件時,直接報錯// 下面是java的編譯、執行、報錯,與後面c/c++類似label java npp_save // 保存當前程序文件cmd /c if exist $(NAME_PART).class (del $(NAME_PART).class) // 調用cmd窗口刪除上次程序執行時編譯的結果,/c是表示執行完cmd指令後關閉窗口,不加/c會使窗口一直打開,無法向下執行腳本npp_console enable //打開顯示,可以查看下面語句執行結果javac -encoding UTF8 $(FILE_NAME) // 設置javac的編碼格式為UTF8,否則代碼中含有中文注釋會報錯npp_console disable // 再次關閉顯示,因為下面的語句沒必要呈現在console窗口npp_exec CheckFileExists $(NAME_PART).class // 調用自己寫的腳本判斷是否存在.class文件if $(FILEEXISTS)==1 goto j1 // 編譯成功執行運行,不成功拋錯goto error2label j1npp_console enablejava $(NAME_PART)npp_console disablegoto endlabel cppnpp_savecmd /c if exist $(NAME_PART).exe (del $(NAME_PART).exe)npp_console enableg++ -o $(NAME_PART).exe $(FILE_NAME)npp_console disablenpp_exec CheckFileExists $(NAME_PART).exeif $(FILEEXISTS)==1 goto c1goto error2label c1npp_console enable$(NAME_PART)npp_console disablegoto endlabel cnpp_savecmd /c if exist $(NAME_PART).exe (del $(NAME_PART).exe)npp_console enablegcc -o $(NAME_PART).exe $(FILE_NAME)npp_console disablenpp_exec CheckFileExists $(NAME_PART).exeif $(FILEEXISTS)==1 goto c2goto error2label c2npp_console enable$(NAME_PART)npp_console disablegoto endlabel pythonnpp_savenpp_console enablepython $(FILE_NAME)npp_console disablegoto endlabel error1npp_console enableecho 錯誤:非程序文件npp_console disablegoto endlabel error2npp_console enableecho 錯誤:編譯未通過npp_console disablegoto endlabel endnpp_console enable

保存腳本,我起的名字叫Run Any Program,然後在 Notepad++菜單欄 -> 運行-> 管理快捷鍵 -> Plugin commands 下找到Run Any Program,並設置快捷鍵用來運行這個腳本(比如Ctrl+D),大功告成!

Step 4. 運行腳本

用notepad++編輯代碼文件時,建議選擇UTF-8編碼,點擊菜單欄->格式->以UTF-8無BOM格式編碼。以免運行時出現編碼錯誤

Python

當你用notepad++編輯一個.py結尾的python腳本時,按下Ctrl+D

運行失敗:


運行成功:


Java

同上,當編輯.java結尾的java文件時,按下Ctrl+D

編譯失敗:

編譯、運行成功:

C/C++

同上,編輯以.c結尾的C文件或以.cpp結尾的C++文件時,按下Ctrl+D

編譯失敗:

編譯、運行成功:

非以上程序文件
當運行一個非以上後綴結尾的程序文件時,按下Ctrl+D:

理想與現實

聊聊我為何萌生寫這個腳本的念頭,以及遇到的一些坑,不感興趣的可以直接略過~
起因

在我之前寫的『windows下用Notepad++開發Python、C/C++』一文中提到過運行命令,然而只能輸入一行shell指令,功能極大受限

運行中輸入指令時,系統默認當前路徑是notepad++的安裝路徑,而不是程序文件所在路徑,這一點很不方便。即便加了cd "$(CURRENT_DIRECTORY)"希望能跳轉到當前代碼文件所在路徑,但也不太work

當在notepad++中編輯某個代碼文件時,對於不同程序語言,一般人都會在運行或者NppExec中寫不同的腳本、設置不同的快捷鍵來看編譯運行效果,非常不便

理想
在NppExec中寫DOS命令行,取代所有運行的命令即可

現實
仔細閱讀了NppExec的說明文檔,發現它只支持部分DOS命令(if, del, goto)而像 else, exist根本不支持,特別蛋疼,想了很多方法才搞定;另外用 del老提示找不到文件,只能專門用NppExec寫個腳本判斷文件是否存在;還有就是 if 判斷完了必須用goto跳轉,增加代碼量和代碼邏輯。Anyway,最後總算解決了

所以,其實我現在更喜歡在Mac下用Sublime Text 3,Mac大法好;-P

Bonus

最近幾篇文章我都是用Markdown寫的,可以直接生成pdf,但公眾號平臺無法插入附件,另外公眾號對Markdown支持不好,呈現出來的文章容易代碼縮進混亂,有些特性也不支持。

所以我準備提供pdf下載連結,具體將在明天發布的『數據挖掘比賽通用框架』一文中放出,敬請期待

相關焦點

  • Notepad++編譯和運行C語言(GCC)
    (初學者過早接觸IDE不利於理解程序構建的過程)在看這篇文章的時候,假設你已經知道如何把GCC配置到環境變量,並且會在命令行/終端下使用gcc 編譯C代碼文件 並運行了。關於notepad++notepad++是款windows下優秀的編輯器。
  • Python自學筆記——搭建NotePad開發環境
    1.按下快捷鍵【Win+R】打開「運行」,搜索「cmd」,或者在電腦搜索欄直接搜索「cmd」。2.在命令提示窗口輸入「python」,查看返回值,如果返回Python的版本信息,則說明一切正常,Python的環境變量已經添加好了,否則需要添加環境變量。
  • 腳本類惡意程序分析技巧匯總
    至於exe的惡意程序不在本節討論範圍之內powershell病毒分析powershell簡介Powershell 是運行在windows機器上實現系統和應用程式管理自動化的命令行腳本環境。你可以把它看成是命令行提示符cmd.exe的擴充,不對,應當是顛覆。 powershell需要.NET環境的支持,同時支持.NET對象。
  • dos命令start教程,並行運行exe程序或者啟動bat批處理cmd腳本
    今天我們學習DOS命令start這個命令,它可以啟動一個EXE程序,也可以啟動一個BAT批處理腳本,這個命令我們經常用到,是一個比較重要的命令,start這個命令是個並行的命令,就是說運行exe的時候它可以同時運行多個,稍後我會用批處理腳本和大家演示一下,參數我會簡單的介紹一下,然後還會講一下使用start啟動新的不同窗口批處理變量互相訪問使用這些操作。
  • 一個堆題inndy_notepad的練習筆記
    我們可以得到以下信息:本程序是32位程序,每次加載時地址固定,如果存在棧溢出,需要考慮canary check的問題,並且溢出之後不能在數據區(棧、bss段)布局shellcode,因為數據區不可執行,所以需要通過ROP實現我們的意圖。同時,程序本身不存在system和/bin/sh,需要通過洩露libc的地址來獲取我們需要的libc中的函數(如system)。
  • 如何高效的使用-Notepad++
    本文為原創投稿文,作者:微笑面對生活Notepad++功能比 Windows 中的 Notepad(記事本)強大,除了可以用來製作一般的純文字說明文件,也十分適合編寫電腦程式代碼
  • B站超強腳本開源!一鍵自動完成任務...
    B站超強腳本開源!一鍵自動完成任務...... 從二次元到泛娛樂化彈幕網站,再到現在無論是追劇還是看教程,只要你想要看的,基本都可以在B站上面找到。因此,B站也深受程式設計師們的歡迎,因為上面有大量有用的編程教程。
  • ELF PHP 可執行程序運行後加載重型腳本的過程
    我們看到這php-fpm在運行laravel時,打開的腳本文件那是相當多,我這裡只是截圖部分,為了處理一個小小的訪問,它打開一堆腳本文件,後面它直接去訪問500這個文件了。很不給面子。7 接下來,我們一步步的看一下我運行,php-fpm為了處理這個重型框架到底加載了多少php腳本文件【部分截圖】【自己用電腦看,不要用小的可憐兮兮的手機看,渣男就應該用PC看】
  • 如何使用MathWorks的MATLAB程序創建腳本文件
    如何使用MathWorks的MATLAB程序創建腳本文件 網絡整理 發表於 2019-11-14 17:30:57 步驟1:打開程序
  • 大成研究 | 遊戲腳本程序編寫及發布的刑事法律性質初探
    一、外掛程序與腳本程序的區別外掛程序與腳本程序的形式相近,但本質上卻是不同的程序,主要區別如下:概念:外掛是指利用電腦技術針對一個或多個遊戲,通過改變軟體的部分程序製作而成的作弊程序;(遊戲)腳本程序是針對遊戲設置批處理文件,模擬玩家人手操作,將不同的命令組合起來,並按確定順序自動連續地執行的輔助程序
  • 改進你的腳本程序的 5 個方法 | Linux 中國
    初步嘗試我嘗試寫一個腳本程序時,原始程序往往就是一組命令行,通常就是調用標準命令完成諸如更新網頁內容之類的工作,這樣可以節省時間。通過判定是否滿足特定條件,可以控制程序選擇執行相應的腳本命令段。比如說,想要判斷系統是否安裝了 Java ,可以通過判斷系統有沒有一個 Java 庫目錄;如果找到這個目錄,就把這個目錄路徑添加到可運行程序路徑,也就可以調用 Java 庫應用了。
  • Linux平臺下啟動java程序的腳本編寫
    Java在window下的腳本很多人都會,因為大家都在window平臺下開發。但是一旦上生產系統就要會更換到Linux平臺下。畢竟java是跨平臺的嗎?可是,程序是跨平臺的,啟動腳本卻是和系統平臺緊密相關的。
  • MISA+Primer3設計SSR引物(三):批量化運行腳本
    原計劃本次內容是按自己思路修改的msia腳本寫一個shell腳本,但是看我推文的大部分都是搜索過來的
  • notepad++TextFx一鍵去除文本重複行
    notepad++ 功能強大,使用廣泛,而且擁有強大的插件團!現介紹如何使用notepad++ 刪除重複行先安裝TextFx插件,可以去插件菜單裡找到TextFx安裝就好了,重啟菜單會多一項TextFx(如下圖)  
  • 推薦:Linux啟動Java程序jar包Shell腳本
    今天就推薦給大家一個幾乎通用的Shell腳本,它支持Java程序Jar包的服務啟動、服務停止、服務狀態查看,同時在腳本中追加了一些語法說明,具體Shell命令,還請大家自行上網學習。#!/bin/sh# 該腳本為Linux下啟動java程序的腳本## author: luandy# date: 2021/1/15## 特別注意:# 該腳本使用系統kill命令來強制終止指定的java程序進程。# 所以在殺死進程前,可能會造成數據丟失或數據不完整。
  • 【運維開發】windows下的自動化腳本語言autoit
    windows則不同,我們的習慣是滑鼠在前端工具上操作,這不是python等腳本語言所不擅長的,如果要用python等腳本實現,需要運維人員在思維進行轉變,將前端的界面操作轉換轉化為後臺可運行的腳本語言實現。另外,當遇到一些不支持二次開發的商業軟體,上面的轉換就會變得無解。
  • 教你如何批量運行自動化腳本,高效工作!
    實際上 .bat 文件裡面的命令也是靠 cmd.exe 解析執行的,所以我們可以在 .bat 文件中編寫運行 airtest 腳本的命令,以此來執行 airtest 腳本。我們來先來複習下,使用命令行運行 Airtest 腳本的指令: airtest run + 腳本文件路徑 ,另外還可以在命令後面跟上 --device、--log 和 --recording 等參數。
  • 基於Bash腳本自己開發ROS的一鍵啟動
    端午節沒啥事,左右苦思冥想,發現網上針對ROS的bash啟動腳本幾乎還是處於0的狀態。為此針對性的給ROS開一個bash腳本的教程是非常有必要的。也希望各位大佬能提點意見,如果後續合適,我會繼續根據各位的意見來繼續開坑的。首先我們知道常見的bash腳本是基於shell文件的。因為bash是免費的並且很容易使用。所以很多開源作者所提供的腳本都是使用bash。
  • 怎樣設置嵌入式Linux開機自動運行用戶程序?
    本文是Linux嵌入式開發日常記錄,今天和大家分享下如何讓嵌入式Linux系統開機後自動運行用戶編寫的程序?嵌入式系統的目標是要執行用戶編寫的、完成指定任務的程序,並且這個用戶程序應該在系統啟動後自動執行。
  • 巧用bat文件做Airtest腳本的「批量運行」
    之前我們的教程講過如何使用命令行運行Airtest腳本,實際上 .bat 文件裡面的命令也是靠 cmd.exe 解析執行的,所以我們可以在 .bat 文件中編寫運行airtest腳本的命令,以此來執行airtest腳本。