發表文章

目前顯示的是有「命令提示字元」標籤的文章

產生空檔案和單行內容的檔案

產生空檔案 Windows命令提示字元 copy NUL a.txt Linux command line touch a.txt 預先創建一個大小的檔案 truncate -s 47484 empty_file truncate -s 50k empty_file 單行內容檔案 這裡指的內容只有一行,且沒有換行符號 Windows命令提示字元 Linux command line echo -n "one string without next line character" > a.txt echo -e "one string without next line character\c" > a.txt printf "one string without next line character" > a.txt

解決Window10的cmd下找不到react-native指令

雖然Window10的cmd下找不到react-native指令,但是npm, node, yarn等等都可以用,我主要是使用yarn開發react-native。我也不知道甚麼時候開始有這個問題的,只知道系統剛灌好沒有這個問題。 羅列一些yarn的指令 查看help $ yarn --help 查看yarn已安裝在系統層級的套件 $ yarn global list yarn global v1.22.5 info "react-native-cli@2.0.1" has binaries:    - react-native 查看yarn系統層級的套件目錄 $ yarn global dir C:\Users\{使用者名稱}\AppData\Local\Yarn\Data\global 查看yarn系統層級的執行檔目錄 $ yarn global bin C:\Users\{使用者名稱}\AppData\Local\Yarn\bin 解決找不到react-native指令 查看yarn系統層級的執行檔目錄 將該目錄加入你的環境變數PATH 重啟cmd 完工 如果是其他作業系統可以參考下面這篇加入你的PATH https://stackoverflow.com/questions/43501514/how-to-display-yarn-globally-installed-packages Windows: %LOCALAPPDATA%/Yarn/config/global OSX and Linux non-root: ~/.config/yarn/global Linux if logged in as root: /usr/local/share/.config/yarn/global

用ffmpeg抓出影片部分並旋轉90度

這個方法僅改變影音檔的metadata,所以處理速度快,但是對於一些不支援旋轉屬性的metadata的播放器沒有效果 如果發現設定了90度處理後沒變的話, 是因為影片metadata本來有寫轉90度, 改看看0度或270度再試試 dpn1是指drive,path,name,變數1 x1是指副檔名(extension),變數1

用ffmpeg串接多個影音檔案

官方文件其實有寫怎麼做串接影音檔案 http://ffmpeg.org/ffmpeg-formats.html#concat 1. 產生要串接的檔案列表 (for %%i in (*.wav) do @echo file '%%i') > mylist.txt 2. 執行串接指令 ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav 我手動產生串接檔案DJI_0098_list.txt內容,還要寫file空格加上檔案路徑,路徑要注意跳脫字元的問題或是加上單引號''讓字串不處理 file E:\\20191217\\DJI_0098_001.MP4 file E:\\20191217\\DJI_0098_002.MP4 file E:\\20191217\\DJI_0098_003.MP4 執行指令 ffmpeg.exe -f concat -safe 0 -i DJI_0098_list.txt -c copy DJI_0098.MP4 -safe 0是不檢查指定的檔案路徑中是否含有不合法字元 比較懶的方式是寫好串接文字檔後,丟進下面這個script讓他跑,就會用文字檔名當作串接後的MP4檔名 另外官方針對一些視訊, 需要再調整的部分可以參考下面 http://www.ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f 下面這個寫法在我的案例(H.264 4k MP4)是無法成功的,影片長度跟第一個檔案的一樣。 ffmpeg -i "concat:input1.avi|input2.avi|input3.avi" -c copy output.avi

用ffmpeg轉換任意影片成mp3

dpn1是指 driver,path,name,變數1

Windows設置10,172,192私有網路網段走特定介面卡

為了Internet上網使用WIFI,有線網路進行sniffer網路封包,參考了 這篇 來設定路由。 查看目前網卡狀態 包含IP/IPv6、預設閘道(Gateway) ipconfig 印出的內容如下 無線區域網路介面卡 區域連線* 2:    媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線    連線特定 DNS 尾碼 . . . . . . . . : 無線區域網路介面卡 區域連線* 4:    媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線    連線特定 DNS 尾碼 . . . . . . . . : 無線區域網路介面卡 Wi-Fi:    連線特定 DNS 尾碼 . . . . . . . . :    IPv6 位址. . . . . . . . . . . . .: 2001:b400:e232:8074:5d4f:c8:27d3:7aa7    臨時 IPv6 位址. . . . . . . . . . : 2001:b400:e232:8074:902e:41f6:518b:70d7    連結-本機 IPv6 位址 . . . . . . . : fe80::5d4f:c8:27d3:7aa7%12    IPv4 位址 . . . . . . . . . . . . : 192.168.43.23    子網路遮罩 . . . . . . . . . . . .: 255.255.255.0    預設閘道 . . . . . . . . . . . . .: fe80::ae57:75ff:febd:d311%12                                        192.168.43.2...

Windows 10指定使用IGMPv2

微軟windows 10文件指出 https://docs.microsoft.com/en-us/powershell/module/nettcpip/set-netipv4protocol?view=win10-ps 使用PowerShell的Set-NetIPv4Protocol指令就可以改變IGMP版本 使用系統管理員啟動PowerShell 不會啟動Powershell可以用系統Ctrl+X啟動快捷選單選系統管理者進入PowerShell 如果快捷選單中只有命令提示字元,也可以進入後再輸入powershell進入 Set-NetIPv4Protocol -IGMPVersion Version2 相反的指令就是get-netipv4protocol, 可以查看目前設置的結果 Get-NetIPv4Protocol DefaultHopLimit             : 128 NeighborCacheLimit(Entries) : 256 RouteCacheLimit(Entries)    : 4096 ReassemblyLimit(Bytes)      : 66082592 IcmpRedirects               : Enabled SourceRoutingBehavior       : DontForward DhcpMediaSense              : Enabled MediaSenseEventLog          : Disabled IGMPLevel                   : All IGMPVersion          ...

網路MTU測試

圖片
參考 tp-link官網上 的搜尋網路最佳MTU教學 1. Windows使用 ping {某個可以ping的網站} -f -l {要測試的封包大小} -f 是設定IP層的do not fragment旗標 -l 是設定ICMP的封包大小 像是我測試出來的封包大小可以到1472,再加上ip header大小28,就是我的網路最佳MTU設定1500(=1472+28) 看網路介面卡目前的MTU設定用 netsh interface ipv4 show interface 設定網路介面卡的MTU是用下面的指令 netsh interface ipv4 set subinterface {用上個指令看到的網路介面卡名稱,例如我的是"乙太網路"} mtu={上面測試出來的MTU值} store=persistent netsh指令請參考: http://www.james-tw.com/windows/windows-netsh-zhi-ling-cao-zuo 2. Linux上可用 ping {某個可以ping的網站} -s {要測試的封包大小} -M do -s是設定ICMP的封包大小 -M do一樣是設定do not fragment旗標 測試的封包大小也是一樣要加上28才是MTU最佳設定  看網路介面卡的設定則是用 ifconfig -a 或者是 ifconfig {你的介面卡名稱} 裡面就會有MTU的數值 設定網路介面卡的MTU值 ifconfig {你的介面卡名稱,例如eth0} mtu {上面測試出來的MTU數值} ifconfig指令請參考鳥哥網站 http://linux.vbird.org/linux_server/0140networkcommand.php

C++讀取命令提示字元的參數

圖片
在C/C++中讀取Command line參數 是利用Main函數的兩個參數來處理, 這兩個參數的順序與寫法是固定的, 第一個參數int型態給你的是總共有輸入幾個參數, 第二個參數char**型態給你的是參數的"字串",要注意這是C-style的字串。 NOTE: 會需要寫這個小程式的目的就是,要澄清到底是程式得到的寫錯,還是其他的問題。 下面一個可以顯示所有輸入參數的程式 #include <iostream > #include  < cstdlib > using namespace std; int main(int argc, char** argv) {     for (int i=0 ; i < argc ; ++i)         cout  < <  "["  < <  i  < <  "]"  < <  argv[i]  < <  endl;          return 0; } 實際測試這隻程式的時候會發現 在Command line 輸入 ListCommandLineArgs.exe foo 1234 會輸出 [0]ListCommandLineArgs.exe [1]foo [2]1234 程式讀取到的[0]號參數,往往都是你的程式名稱or程式路徑, 而[1]號參數之後就是我們剛剛在Command line中所輸入的。 所以實際上我們會得到的參數數目總是會多1,也就是我在Command line輸入3個參數,程式會獲得argc=4。 上面提過,因為[*]號參數都是C-style字串資料,所以我們如果要整數or浮點數資料,就需要經過轉換 C函數庫中的 atoi 和  atof 函數就可以幫忙轉換成 int 和 d...

Windows程式內如何取得Command line參數?

可以使用 GetCommandLine()來取得Command line參數,下面一個簡易範例。   int argc;   char** argv = CommandLineToArgv(GetCommandLine(), argc);   string img_path = argc>1?argv[1]:" ";   delete[] argv[0]; // 使用完要刪除   delete[] argv; // 使用完要刪除 因為微軟的SDK只有提供寬字元版的 CommandLineToArgvW,所以我花了點時間寫一般字元的版本, 這個處理並不包含參數中間內有雙引號的情況,不過參數的頭尾是雙引號有做,所以某些參數可能跟系統的不太一樣。 我使用的是狀態機的作法,因為這樣比較容易發想與處理,用一張圖就可以搞定想法與實作。 第一次掃描將空白符號與不必要的符號都設為'\0',並獲得參數數目 argc。 第二次掃描將資料設定到argv中,因為第一次掃描已經將不必要的符號都設為'\0'所以可以用簡便的方法處理argv char** CommandLineToArgv(char* sys_cmd, int& argc) {   int  curr_state;   char **argv, **argv_itr;   char *cmd_itr, *loc;   int   cmd_len = strlen(sys_cmd);   char *cmd     = new char[cmd_len+1];   char *cmd_end = cmd+cmd_len;      strncpy(cmd, sys_cmd, cmd_len);   cmd[cmd_len] = '\0';      argc = 0;   curr_state = 0;   for (cmd_itr=cmd ...

命令提示字元的重導向,流程控制,條件執行,定義變數功能

這裡主要介紹的都是Windows的Command line指令,Windows的指令不分大小寫。 如果參數、檔案名稱或目錄路徑中有空白,就必須用雙引號刮起來,否則下的指令會出錯。 "C:\Foo foo\bar.exe" foo.txt "foo Foo.txt" 特殊符號 >,<,|,&,^都有各自的功能 ,皆不能在檔名或參數中出現。 除非你用了^才能印 出特殊字元,這個就 類似C/C++的跳脫字元會用斜線 \ 開頭, 在要顯示的特殊符號前加上^,例如^^ 就可以表示特殊符號^,例如: Echo 1000022 ^> ^^ ^< ^& 123 會顯示 1000022 > ^ < & 123 重新導向(螢幕資料儲存到檔案) 重新導像符號就是將螢幕上的文字輸出,或者錯誤訊息的輸出,導向到某個指定的檔案中存起來,或者是將特定檔案的資料當成使用者的輸入。 將螢幕上的文字輸出到檔案使用>符號 echo abc > stdout.txt 原本前面的指令是在螢幕上輸出abc三個字,但是我們使用了導向符號,就變成檔案中才會看到abc三個字。 這個功能在跑批次時非常好用,但是缺點就是你會不知道程式有沒有在跑。 另外,兩個連續的>>符號,表示的是加入到指定的檔案,先前檔案內的內容不會被刪掉。 >> 使用<符號則是將檔案當成使用者的輸入丟到程式/指令裡面,這個功能一般比較少用 < 流程控制(if, goto) 我比較少用這種功能,因為有些在C/C++程式裡面寫就好了 if %NUMBER_OF_PROCESSORS%==1 echo you've only one processor if not "%OS%"=="" @echo your os is %os% if "%abc%"=="" (echo nothing) else (echo yes) if /i "a"==...

命令提示字元呼叫VC++的editbin

使用到的editbin,如果沒有用,新手在寫這種批次檔的時候會遭遇問題 從捷徑裡面可知道實際上是呼叫 然後看這些批次檔中 "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" x86 editbin /LARGEADDRESSAWARE myapp.exe

命令提示字元的功能按鍵,管線導出導入,

功能按鍵與說明 Tab 自動完成功能,可以節省很多打字時間。 F7 輸入過的指令歷史紀錄 Ctrl + C 中斷程式。這個一定要會用 Ctrl + Z 命令提示字元的指令都是大小寫無關,這是Windows系統的特性,但是指令所要的 參數 寫則會大小寫有關。 命令提示字元內的大部份指令都可以打  指令 /help 來取得相關的說明 。 help {系統指令} 顯示該系統指令的說明 cls 清除目前命令提示字元的顯示內容 @echo off 從這行開始不顯示提示內容 echo this sentence following the echo command will be printed in the screen. 顯示echo後面寫的這串文串 pause 要求使用者輸入任意鍵之後才能繼續。 導出、導入與管線 輸出資料 dir > out.txt 將螢幕輸出的資料導向到out.txt中 dir >> out.txt 將螢幕輸出的資料加到out.txt中 輸入資料 clip < out.txt 將檔案的內容導入到程式中 管道/管線 dir | clip 將螢幕輸出的資料導向到 剪貼簿 中 (Windows 7才有clip) 管線就像是兩個命令的結合,原來需要鍵入兩個命令:(1) 將前面命令的資料導出到檔案(2)將檔案導入到後面的命令,使用管線後,只不過中介的"檔案"由系統自動操作不需寫出再寫入。 type xxx.txt 可以將txt內的字都印到螢幕上。和導入導出結合可以將兩個檔案作結合。類似Linux上的cat : 後面接 單行 註解文字 REM 指令空格後, 後面可接單行 註解文字 dir /b 僅顯示檔案名稱 dir /s 顯示指定目錄及其子目錄下的檔案。這個指令非常好用,結合/b可以將批次目錄下的檔案列表直接弄好。 dir /a:d 只顯示目錄 dir /o:N 依照英文字母排列順序 copy a.txt+b.tx combined.txt 結合兩個文字檔案 copy /b a.exe+b.exe combined.exe 結合兩個影像檔或是檔案 copy /b a.exe+b.exe 結合兩個檔案儲存到a.exe中 copy /y *....

如何在命令提示字元中印出TAB字元

最簡單的方法,用SET指令輸入一個Tab SET TAB= echo This %TAB% is %TAB% a %TAB% demo %TAB% for %TAB% TAB %TAB% character.

命令提示字元跑一連串的實驗

最近都在用command line幫忙跑實驗,不過總是會有些功能無法幫上忙。 因為是資工所,所以在遭遇不確定是否有提供某項的功能時,可善用熟悉的C/C++來解決它, 像是實驗用程式會在螢幕上輸出數據資料,因為每個實驗程式會輸出的數據不太一樣, 就可以寫一個簡單的parser去汲取所需資料,再用cout/cerr/printf輸出到螢幕上, 再用Command line的導向功能(>與>>或是2>,2>>)決定這些資料是否要輸出到檔案, 最近寫的一個Command line檔範例: SET BGRPATH=Images\ SET EXEPATH=GreenMSEOrderParser.exe for %%r in (3 4 5 6 7 8 9) do ( for %%v in ("%BGRPATH%*.bgr") do ( del /f GMSEOrder_%%~nv_R%%r.txt for %%t in (1 2 3 4 5 6 7 8 9) do ( set /p=%%~nv_T%%t   > GMSEOrder_%%~nv_R%%r.txt %EXEPATH% %%~nv_T%%t\*_R%%r*.mse >> GMSEOrder_%%~nv_R%%r.txt ) ) )

命令提字元的for迴圈從檔案列表處理資料

dir /B *.bmp > list.txt for /F  %%t in (list.txt) do (   DepthToYUV.exe %%t output.yuv ) pause

用命令提示字元將多個yuv圖檔合併成一個yuv序列

妥善利用Windows command line的copy指令, 就能將多個yuv圖檔合併成一個yuv序列。 copy NUL a.yuv copy /b a.yuv+*.yuv 我們知道YUV檔其實每一張Frame都只是連接著存放, 依照這個想法, 如果有很多張YUV圖片,都放在當前目錄下, 我們可能會用下面這種方式將yuv檔合併成一個a.yuv (低效率作法) dir /b *.yuv > ListFile.txt copy NUL a.yuv for /f %%x in (ListFile.txt) do ( rem echo %%x copy /b a.yuv+%%x ) del /F ListFile.txt 透過copy指令的特殊語法,我們也可以將yuv檔合併成一個a.yuv 簡便且高效率作法 copy NUL a.yuv  copy /b a.yuv+*.yuv 先用NUL 創立一個空檔案,然後把當前目錄下的所有檔案都拷貝過來 這個作法的缺點就是,檔案不見得會按照順序合併,因為*.yuv是由系統決定順序 我自己的測試是,就算檔名是連續的,還是不見得會照順序,可能是按檔案放到這個資料下的時間順序來處理的

從命令提示字元執行Matlab的M檔程式

Command Line執行Matlab的M檔程式 1. 首先設定系統路徑,把Matlab的執行檔(含有matlab.exe的目錄)路徑 例如:Matlab 2011a的執行檔路徑為 C:\Program Files\MATLAB\R2011a\bin 2. 指令 matlab -nodesktop -nosplash -r M檔案的名稱(不需要含副檔名.m) 它就會run指定的.m檔囉! 這裡給一個Command line的應用,呼叫Matlab將Excel檔內的資料成圖片 for %%v in (test_videos\*.yuv) do ( matlab -nodesktop -nosplash -wait -r "xls2epsc('ExpRes_%%~nv.xlsx', 'RD_%%~nv.eps')" ) matlab的-wait選項是等待程式結束才繼續。