請選擇 進入手機版 | 繼續訪問電腦版

微剋多資訊

 找回密碼
 註冊

Login

Google帳號登入

搜索
回覆 14則 瀏覽 22622篇

[問題已解決] 【BAT】隱藏批次檔的執行視窗並帶入外部引數的方法

該用戶從未簽到

發表於 2020-6-17 09:52 | 顯示全部樓層 |閱讀模式
本帖最後由 jmsdhn 於 2020-6-18 18:18 編輯

打擾了
最近發現某種以純批次檔隱藏自身視窗的寫法


if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit

:begin

軟體名稱.exe
RD/s/q 某需些資料夾
del/q 某些檔案


這寫法可以讓後續指令軟體名稱.exe結束後自動被執行且不會讓BAT黑畫面一直在

不過
個人希望軟體名稱.exe可以做為某些檔案的關聯程式

寫成這樣
run("%~nx0 h %2",0)...............軟體名稱.exe %2
不行


或是echo %1>AAA.log(%1為可被軟體名稱.exe讀取的檔案
AAA.log經for轉為檔案的絕對路徑%KKK%
run("%~nx0 h",0)...............軟體名稱.exe %KKK%
也不行
也想到shift指令

請教是否有適合的寫法?
感謝


該用戶從未簽到

發表於 2020-6-17 16:08 | 顯示全部樓層
是想要用A軟體打開B檔案之類的嗎?
不知道A軟體本身是否支援參數

可以試試看透過 nircmd 去跑
不過我只用到 hide 功能 (就是隱藏CMD畫面),然後帶參數的話是執行目標本身支援的參數確定可以用

使用道具

該用戶從未簽到

 樓主| 發表於 2020-6-17 18:40 | 顯示全部樓層
本帖最後由 jmsdhn 於 2020-6-17 18:52 編輯

感謝回應
這第三方程式個人可能要先熟悉才能下定論是否可用

或許個人再解釋一下
有點擔心越解釋越亂^^"

先前經常用的是VBS的隱藏CMD方式
ws.run """AAA.bat"" ""參數""",0
這種方法確實已經夠用
但是這個參數基本上是不常變動的
個人只用來讀取某資料夾的絕對路徑
也很少變動
似乎VBS也不能像BAT一樣可以隨意設定外部引數
所以就想用BAT來解

也因為知道這個BAT自隱方法
現在想把AAA.bat變成直接抓某個檔案進來%1(也可以視為把檔案拖到AAA.bat上面放開)(希望可以%1=X:\CCC.prj
( AAA.bat是可以自己隱藏CMD視窗)
如下必要寫法:
========================================
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
========================================
第一次執行時會RUN第二指令
將h給AAA本身
第二次執行會因為%1=h
就執行begin下的指令
假定是BBB
如果只是執行BBB.exe那就還好
很簡單


但現下是想讓BBB.exe讀取%1
但%1就一直=h
不知道要如何在第二次當if "%1" == "h"之後
%1可以變成X:\CCC.prj


^^"




使用道具

該用戶從未簽到

發表於 2020-6-17 22:49 | 顯示全部樓層
jmsdhn 發表於 2020-6-17 18:40
似乎VBS也不能像BAT一樣可以隨意設定外部引數

看看這個是不是你要的:
How to call Run() with parameters

使用道具

該用戶從未簽到

 樓主| 發表於 2020-6-18 08:42 | 顯示全部樓層
本帖最後由 jmsdhn 於 2020-6-18 12:22 編輯

感謝回應
感覺...VBS這幾列看不出類似BAT外部引數的影子

譬如AAA.BAT是可以從%1增加到%9吧
只要在AAA.BAT的內容中寫上%1
就可以在AAA.BAT後面加入一個參數(可能是H 可能是X:\ 可能是Y:\TTT.log)

若又在AAA.BAT的內容中除了寫上%1 又增加了%2 %3等等
就可以在AAA.BAT後面加入多個參數

這是個人所表示的
BAT可以隨意增加外部引數的意思

想想
可能是BAT本身受限之故吧

本來也想出把剛進入AAA.bat的檔案其絕對路徑(X:\CCC.prj)暫寫到某log檔保留
然後開始自隱指令
begin之後
用for轉換log檔內容 set KKK=X:\CCC.prj
再執行
BBB.exe %KKK%
但這方法還是不行

現下想的
可能先把該被讀取檔先複製到%TEMP%
並命一個通用名
然後不論VBS自隱或BAT自隱
都內設讀取這個通用名
或許可以解決吧
其實到這個想法地步
大概也用不到BAT自隱了


補充一下
這是把某文字檔拖放到AAA.bat所發生的情況


AAA.bat內容:
====================================
@echo off

if "%1" == "h" goto begin
echo %1>%TEMP%\TTT.log
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)
exit

:begin
for /f "delims=" %%i in (%TEMP%\TTT.log) do set "TTT=%%i"

"C:\Windows\System32\notepad.exe" %TTT%
====================================


本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x

使用道具

該用戶從未簽到

發表於 2020-6-18 14:17 | 顯示全部樓層
本帖最後由 maodou 於 2020-6-19 22:01 編輯
jmsdhn 發表於 2020-6-18 08:42
感謝回應
感覺...VBS這幾列看不出類似BAT外部引數的影子

試試看把
  1. mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)
複製代碼
改成
  1. mshta vbscript:createobject("wscript.shell").run("%~dp0%~nx0 h",0)(window.close)
複製代碼
上面寫法路徑跟檔名內都不可以有空格
改成下面這樣就可以:
  1. @echo off
  2. if %1 == h goto begin

  3. echo '%1' > %TEMP%\TTT.log
  4. mshta vbscript:createobject("wscript.shell").run("%~f0 h",0)(window.close)
  5. exit

  6. :begin
  7. for /f "delims='" %%i in (%TEMP%\TTT.log) do set "TTT=%%i"
  8. "C:\Windows\System32\notepad.exe" %TTT%
複製代碼
備註: 2020/06/19
修改了 if '%1' == 'h' goto begin 為 if %1 == h goto begin
修改了 %~dp0%~nx0 為 %~f0

使用道具

該用戶從未簽到

 樓主| 發表於 2020-6-18 18:18 | 顯示全部樓層
咦!!!
解了耶~

這麼說
個人貼的那圖
指的是aaa.bat沒有被vbs找到吧

感覺個人犯了BAT的低級錯誤
%~nx0只有檔案aaa.bat本身
而應該寫成%~dp0%~nx0
aaa.bat的絕對路徑才是

畢竟VBS大多只吃絕對路徑
除非VBS和BAT在同一路徑
但這個BAT自隱
卻沒有實體的VBS
而讓個人有無從判斷的感覺
搞不好%~dp0%~nx0也可以改成%~f0也說不定!!!

解了
開薰~
感謝M大開示!!!

使用道具

該用戶從未簽到

發表於 2020-6-18 18:33 | 顯示全部樓層
jmsdhn 發表於 2020-6-18 18:18
搞不好%~dp0%~nx0也可以改成%~f0也說不定!!!

%~f0 也可以, 不過如果路徑或檔名內有空格, 引號跟for的delims寫法還是要改

使用道具

該用戶從未簽到

 樓主| 發表於 2020-6-18 19:00 | 顯示全部樓層
嗯嗯了解
感謝M大開示

%~dp0%~nx0也等於%~f0

而萬一BAT所在的路徑含有空格時
還必須加上兩組引號比較安心
所以具有自隱功能BAT的更確保寫法應該就是這樣了
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~f0"" h",0)(window.close)
exit
:begin
或是
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~dp0%~nx0"" h",0)(window.close)&&exit
:begin
單列指令比較漂亮?ㄎㄎ

1 0

使用道具

該用戶從未簽到

 樓主| 發表於 2020-6-19 12:29 | 顯示全部樓層
maodou 發表於 2020-6-18 18:33
%~f0 也可以, 不過如果路徑或檔名內有空格, 引號跟for的delims寫法還是要改

...

原來還有用上單引號! 將絕對路徑含雙引號完全視為字串 
保留了更完整的資料
再用for去掉單引號 
含空白的絕對路徑檔案也可被讀取了

這寫法更嚴謹
需要抓住第一次%1的會很受用

話說
為了這個單引號
整個早上想去找出單引號的用法
但大多是在講C語言等等
if/?
也沒有甚麼敘述
大概很單純
單引號框內被視為字串吧

開始亂想
是否以後if字串比對都用單引號會不會比較好了

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

Discuz! X

© 2009-2017 Microduo

快速回覆 返回頂部 返回列表