上次發帖是有一個輸入資訊,趙4老師給了個思路,創建bat檔案內容為:su015 <in.txt >out.txt
代碼為
Private Sub Command1_Click()
Dim str As String
On Error Resume Next
Open "c:\Tribon\M3\Bin\in.txt" For Output As #1
Print #1, "e:\1.txt"
Close #1
Open "c:\Tribon\M3\Bin\tmp.bat" For Output As #1
Print #1, "cd /d c:\Tribon\M3\Bin"
Print #1, "su015 <in.txt >out.txt"
Close #1
Shell "c:\Tribon\M3\Bin\tmp.bat", vbHide
Open "c:\Tribon\M3\Bin\out.txt" For Input As #1
Line Input #1, str
Debug.Print str
Close #1
Kill "c:\Tribon\M3\Bin\in.txt"
Kill "c:\Tribon\M3\Bin\tmp.bat"
Kill "c:\Tribon\M3\Bin\out.txt"
End Sub
但這次要輸入兩次的輸入資訊,如下圖

我使用su016 <in.txt <in2.txt 卻不管用。請教大家該怎么處理,謝謝!
uj5u.com熱心網友回復:
in.txt 中寫兩行啊e:\111.txt
da.txt
uj5u.com熱心網友回復:
樓主不會舉一反三?Private Sub Command1_Click()
Dim str As String
On Error Resume Next
Open "c:\Tribon\M3\Bin\in.txt" For Output As #1
Print #1, "e:\111.txt"
Print #1, "da.txt"
Close #1
Open "c:\Tribon\M3\Bin\tmp.bat" For Output As #1
Print #1, "cd /d c:\Tribon\M3\Bin"
Print #1, "su016 <in.txt >out.txt"
Close #1
Shell "c:\Tribon\M3\Bin\tmp.bat", vbHide
Open "c:\Tribon\M3\Bin\out.txt" For Input As #1
Line Input #1, str
Debug.Print str
Close #1
Kill "c:\Tribon\M3\Bin\in.txt"
Kill "c:\Tribon\M3\Bin\tmp.bat"
Kill "c:\Tribon\M3\Bin\out.txt"
End Sub
uj5u.com熱心網友回復:
使用命令重定向運算子可以使用重定向運算子將命令輸入和輸出資料流從默認位置重定
向到不同的位置。輸入或輸出資料流的位置即為句柄。
下表將列出可用的句柄。
句柄 句柄的數字代號 描述
STDIN 0 鍵盤輸入
STDOUT 1 輸出到命令提示符視窗
STDERR 2 錯誤輸出到命令提示符視窗
UNDEFINED 3-9 這些句柄由應用程式單獨定義,并且是各個工具特定的。
數字 0 到 9 代表前 10 個句柄。可以使用命令 Cmd.exe 運行程式并將該程式前 10 個
句柄中的任何一個重定向。要指定想使用的句柄,可在重定向運算子前面鍵入該句柄的
數字。如果未定義句柄,則默認的 < 重定向輸入運算子是 0,而默認的 > 重定向輸出
運算子是 1。鍵入 > 或 < 運算子之后,必須指定要讀取或寫入資料的位置。可以指定
檔案名或另一個現有的句柄。
要指定重定向到現有句柄,請使用與 (&) 字符,后面接要重定向的句柄號
(例如 &句柄#)。例如,下面的命令可以將句柄 2(即 STDERR)重定向到
句柄 1(即 STDOUT):
2>&1
下表列出了可用于將輸入和輸出資料流進行重定向的運算子。
重定向運算子 描述
> 將命令輸出寫入到檔案或設備(例如列印機)中,而不是寫在命令提示符視窗或句柄中。
< 從檔案中而不是從鍵盤或句柄中讀入命令輸入。
>> 將命令輸出添加到檔案末尾而不洗掉檔案中的資訊。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入并將其寫入到另一個句柄輸出中。
| 從一個命令中讀取輸出并將其寫入另一個命令的輸入中。也稱作管道。
默認情況下,可以從鍵盤將命令輸入(即 STDIN 句柄)發送到 Cmd.exe,然后由
Cmd.exe 將命令輸出(即 STDOUT 句柄)發送到命令提示符視窗。
重定向輸入 (<)
要將鍵盤輸入重定向到檔案或設備,請使用 < 運算子。例如,要從 File.txt 獲取
sort 命令的輸入,請鍵入:
sort<file.txt
File.txt 的內容將以字母順序串列的方式顯示在命令提示符視窗中。
< 運算子可以打開具有只讀訪問的指定檔案名。所以,不能使用該運算子向檔案中寫入
資訊。例如,如果以 <&2 啟動程式,則所有試圖讀取句柄 0 的操作都將失敗,因為句
柄 2 最初是以只寫訪問打開的。
注意
0 是 < 重定向輸入運算子的默認句柄。
重定向輸出 (>)
幾乎所有的命令都將輸出發送到命令提示符視窗。即使將輸出發送到驅動器或列印機的
命令也會在命令提示符視窗顯示訊息和提示。
要將輸出從命令提示符視窗重定向到檔案或設備,請使用 > 運算子。可以在許多命令中
使用該運算子。例如,要將 dir 輸出重定向到 Dirlist.txt,請鍵入:
dir>dirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 將創建該檔案。如果 Dirlist.txt 存在,Cmd.exe
將使用 dir 命令的輸出替換檔案中的資訊。
要運行 netsh routing dump 命令,然后將輸出發送到 Route.cfg,請鍵入:
netsh routing dump>c:\route.cfg
> 運算子可以打開具有只寫訪問屬性的指定檔案。所以,不能使用該運算子讀取檔案。
例如,如果使用重定向 >&0 啟動程式,則所有試圖寫入句柄 1 的操作都將失敗,因為
句柄 0 最初是以只讀訪問打開的。
注意
1 是 > 重定向輸出運算子的默認句柄。
復制句柄
重定向運算子 & 可以將輸出或輸入從一個指定句柄復制到另一個指定的句柄。例如,
要將 dir 輸出發送到 File.txt 并將錯誤輸出發送到 File.txt,請鍵入:
dir>c:\file.txt 2>&1
復制句柄時,可以復制該句柄原狀態的所有特性。例如,如果一個句柄具有只寫訪問的
屬性,則該句柄的所有副本都具有只寫訪問屬性。不能將一個具有只讀訪問屬性的句柄
復制到另一個具有只寫訪問屬性的句柄。
使用 & 運算子重定向輸入和副本
要將重定向輸入運算子 (<) 與復制運算子 (&) 一起使用,指定的檔案必須已經存在。
如果輸入檔案存在,Cmd.exe 將以只讀方式打開該檔案,然后將檔案中包含的字符作為
輸入發送到此命令(如同從鍵盤輸入一樣)。如果指定了句柄,Cmd.exe 將指定的句柄
復制到系統現有的句柄中。
例如,要以句柄 0 輸入讀取(即 STDIN)的方式打開 File.txt,請鍵入:
<file.txt
要打開 File.txt,并在內容排序后將輸出發送到命令提示符視窗(即 STDOUT),請鍵入:
sort<file.txt
要查找 File.txt,然后將句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到
Search.txt,請鍵入:
findfile file.txt>search.txt 2<&1
要以句柄 0 輸入讀取(即 STDIN)的方式復制用戶定義句柄 3,請鍵入:
<&3
使用 & 運算子重定向輸出和復制
如果將輸出重定向到檔案且指定了現有的檔案名,Cmd.exe 將以只寫方式打開檔案并覆
蓋該檔案內容。如果指定了句柄,Cmd.exe 將檔案復制到現有句柄中。
要將用戶定義句柄 3 復制到句柄 1,請鍵入:
>&3
要將包括句柄 2(即 STDERR)的所有輸出從 ipconfig 命令重定向到
句柄 1(即 STDOUT),然后將輸出重定向到 Output.log,請鍵入:
ipconfig.exe>>output.log 2>&1
使用 >> 重定向運算子追加輸出
要從命令中將輸出添加到檔案末尾而不丟失檔案中已存在的任何資訊,請使用兩個連續
的大于號(即 >>)。例如,下面的命令可以將由 dir 命令生成的目錄串列追加到
Dirlist.txt 檔案:
dir>>dirlist.txt
要將 netstat 命令的輸出追加到 Tcpinfo.txt 的末尾,請鍵入:
netstat>>tcpinfo.txt
使用管道運算子 (|)
管道運算子 (|) 可以提取一個命令的輸出(默認情況下是 STDOUT),然后將其匯入另
一個命令的輸入中(默認情況下是 STDIN)。例如,下面的命令將對目錄分類:
dir | sort
在本例中,將同時啟動兩個命令,但隨后 sort 命令會暫停,直到它接收到 dir 命令
的輸出為止。sort 命令使用 dir 命令的輸出作為輸入,然后將輸出發送到
句柄 1(即 STDOUT)。
合并帶重定向運算子的命令
可以通過合并帶有其他命令和檔案名的篩選器命令創建自定義命令。例如,可以使用以
下命令存盤包含“LOG”字串的檔案名:
dir /b | find "LOG" > loglist.txt
dir 命令的輸出通過 find 篩選器命令發送。包含字串 "LOG" 的檔案名作為檔案名
串列(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存盤在檔案
Loglist.txt 中。
要在相同命令中使用多個篩選器,請使用管道 (|) 分隔篩選器。例如,下面的命令將
搜索 C 盤上的每個目錄以查找包含 "LOG" 字串的檔案名,并且在命令提示符視窗中
每次顯示一屏:
dir c:\ /s /b | find "LOG" | more
利用管道 (|) 可以將 Cmd.exe 導向為通過 find 篩選器命令發送 dir 命令輸出。
find 命令只選擇包含字串 "LOG" 的檔案名。more 命令可以顯示由 find 命令選擇
的檔案名(在命令提示符視窗中每次顯示一屏)。有關篩選器命令的詳細資訊,請參閱
使用篩選器。
uj5u.com熱心網友回復:
Private Sub Command1_Click()Dim str As String
On Error Resume Next
Open "c:\Tribon\M3\Bin\in.txt" For Output As #1
Print #1, "e:\111.txt"
Print #1, "da.txt"
Close #1
Open "c:\Tribon\M3\Bin\tmp.bat" For Output As #1
Print #1, "cd /d c:\Tribon\M3\Bin"
Print #1, "su016 <in.txt >out.txt"
Close #1
Shell "c:\Tribon\M3\Bin\tmp.bat", vbHide
Open "c:\Tribon\M3\Bin\out.txt" For Input As #1
Line Input #1, str
Debug.Print str
Close #1
Kill "c:\Tribon\M3\Bin\in.txt"
Kill "c:\Tribon\M3\Bin\tmp.bat"
Kill "c:\Tribon\M3\Bin\out.txt"
End Sub
uj5u.com熱心網友回復:
恐怕被你說對了.
uj5u.com熱心網友回復:
老師,你好,我之前試過的,我直接將陳述句寫入bat,cmd直接運行,但是不行啊。


在生成的out檔案中,說沒找到。
麻煩在幫看下,謝謝!
uj5u.com熱心網友回復:
假如da.txt在檔案夾c:\Tribon\M3\Bin\下Print #1, "c:\Tribon\M3\Bin\da.txt"
假如da.txt在檔案夾E:\下
Print #1, "E:\da.txt"
試試看。
uj5u.com熱心網友回復:
還是不行,

,da.txt檔案是它運行后自動保存到TRIBON\M3\BIN檔案夾里的一個LOG檔案。
uj5u.com熱心網友回復:
實在不行,上神器:http://www.autohotkey.comuj5u.com熱心網友回復:
su016你有源代碼嗎?可能在輸入之前先清空輸入流了,比如rewind(stdin);或fflush(stdin);或cin.clear();了。
uj5u.com熱心網友回復:
“按鍵精靈”軟體也可以拿來湊合用。uj5u.com熱心網友回復:
那這樣只能獨立運行這個腳本程式,不能植入到自己寫的程式里了?
uj5u.com熱心網友回復:
如果有su016的源代碼的話,將清除輸入流的相關功能注釋掉,再重新生成exe如果沒有su016的源代碼的話,逆向反匯編并修改之,跳過清除輸入流的相關功能。(此項功能樓主如果有興趣,本ID有償服務:[email protected])
uj5u.com熱心網友回復:
將in.txt前面加一空行試試看。沒準su016沒清除輸入流,只是getchar或getline也不一定。Private Sub Command1_Click()
Dim str As String
On Error Resume Next
Open "c:\Tribon\M3\Bin\in.txt" For Output As #1
Print #1,""
Print #1, "e:\111.txt"
Print #1, "da.txt"
Close #1
Open "c:\Tribon\M3\Bin\tmp.bat" For Output As #1
Print #1, "cd /d c:\Tribon\M3\Bin"
Print #1, "su016 <in.txt >out.txt"
Close #1
Shell "c:\Tribon\M3\Bin\tmp.bat", vbHide
Open "c:\Tribon\M3\Bin\out.txt" For Input As #1
Line Input #1, str
Debug.Print str
Close #1
Kill "c:\Tribon\M3\Bin\in.txt"
Kill "c:\Tribon\M3\Bin\tmp.bat"
Kill "c:\Tribon\M3\Bin\out.txt"
End Sub
uj5u.com熱心網友回復:
謝謝老師還在幫忙想辦法,剛剛我這樣操作也不行。
如下圖
uj5u.com熱心網友回復:
如果沒有su016的源代碼的話,將su016.exe和它運行需要的最小環境以及如何才算正常運行的說明打包email發給我[email protected],我來幫你試試看。
如果真沒別的好辦法,需要逆向反匯編并修改之,使其跳過可能的清除輸入流的相關功能。
樓主應該不吝給我些許報酬吧。
uj5u.com熱心網友回復:
再試試看按第0樓的截圖不用重定向直接用鍵盤輸入還好使不。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/103747.html
標籤:VB基礎類
