微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索

該用戶從未簽到

升級   50.6%

跳轉到指定樓層
主題
發表於 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指令

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


樓主熱門主題

該用戶從未簽到

升級   50.6%

2F
 樓主| 發表於 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


^^"




使用道具

該用戶從未簽到

升級   50.6%

3F
 樓主| 發表於 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

使用道具

該用戶從未簽到

升級   50.6%

4F
 樓主| 發表於 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大開示!!!

使用道具

該用戶從未簽到

升級   50.6%

5F
 樓主| 發表於 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

使用道具

該用戶從未簽到

升級   50.6%

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

...

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

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

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

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

使用道具

該用戶從未簽到

升級   50.6%

7F
 樓主| 發表於 2020-6-19 22:17 | 顯示全部樓層
原來如此
剛把所有單引號去掉後
含空白絕對路徑的被讀取檔案也是可以被辨識的

不過
其實個人有做了一個確保無外部檔案被讀取的情況
也就是直接執行這個自隱的批次檔
如下:
if '%1' == 'hide' goto begin
echo '%1'>%TEMP%\TTT.log
mshta vbscript:createobject("wscript.shell").run("""%~f0"" hide",0)(window.close) && exit
:begin
for /f "delims='" %%i in (%TEMP%\TTT.log) do set "TTT=%%i"
if '%TTT%' == 'ECHO 已關閉。' set "TTT="
"C:\Windows\System32\notepad.exe" %TTT%

發現使用單引號才有反應

猜想應該是%1所抓到的絕對路徑
系統預設就會加上雙引號框
而在
if '%TTT%' == 'ECHO 已關閉。' set "TTT="
如果改成雙引號
if "%TTT%" == "ECHO 已關閉。" set "TTT="

將無反應

可能是雙重雙引號造成if無法辨識之故
除非ECHO 已關閉。可以用其他方式輸出

使用道具

該用戶從未簽到

升級   50.6%

8F
 樓主| 發表於 2020-6-20 18:42 | 顯示全部樓層
這次又搞清楚一些了
確實如M大說的
if不須任何引號

但前提是
%1不能沒定義(也就是直接執行批次檔,卻沒有把目標檔案拖到批次檔上)
換言之
從批次檔外部一定要帶入任何字串
若%1沒定義
則if這條命令會變成
if == hide goto begin
然後就GG了

這個道理在把%1阻絕於境外後
用AAA來判斷
才猛然領悟
所以為了確保批次檔內%1無定義時不會GG
if判斷中還是加上單引號了
如下:
set AAA=%1
if '%AAA%' == 'hide' goto begin
if not defined AAA (
        echo "">%TEMP%\TTT.log
) else echo %AAA%>%TEMP%\TTT.log
mshta vbscript:createobject("wscript.shell").run("""%~f0"" hide",0)(window.close) && exit
:begin
for /f "delims=" %%i in (%TEMP%\TTT.log) do set "TTT=%%i"
"C:\Windows\System32\notepad.exe" %TTT%

這樣做至少不論是否有外部檔案甚至空白絕對路徑
批次檔都可以完全執行

使用道具

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

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2024-5-2 11:45

Discuz! X

© 2009-2023 Microduo

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