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

微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索
12
返回列表 發新帖

簽到天數: 1

該用戶今日未簽到

升級   11.11%

發表於 2020-6-19 20:53 | 顯示全部樓層
單引號框內被視為字串吧

使用道具

該用戶從未簽到

升級   0%

發表於 2020-6-19 21:56 | 顯示全部樓層
jmsdhn 發表於 2020-6-19 12:29
開始亂想
是否以後if字串比對都用單引號會不會比較好了

嗯~~ 不好意思, 我做了錯誤示範, if兩邊如果比的是字串, 不需要任何引號.
所以要寫這樣:
  1. if %1 == h goto begin
複製代碼
https://docs.microsoft.com/zh-tw/windows-server/administration/windows-commands/if
<string1>==<string2>
Specifies a true condition only if string1 and string2 are the same. These values can be literal strings or batch variables (for example, %1).
You do not need to enclose literal strings in quotation marks.


單引號主要是給for用, 其他指令應該要用雙引號

https://docs.microsoft.com/zh-tw/windows-server/administration/windows-commands/for


使用道具

該用戶從未簽到

升級   50.5%

 樓主| 發表於 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 已關閉。可以用其他方式輸出

使用道具

該用戶從未簽到

升級   0%

發表於 2020-6-19 22:29 | 顯示全部樓層
本帖最後由 maodou 於 2020-6-19 22:35 編輯
jmsdhn 發表於 2020-6-19 22:17
猜想應該是%1所抓到的絕對路徑
系統預設就會加上雙引號框

你可以看一下 TTT.log
%1 路徑跟檔名內未含空格的, 不會有引號
%1 路徑跟檔名內有空格的, 會有雙引號
if用雙引號去判斷時, 在遇到有空格的%1會有問題
所以用echo在%1外面加一層單引號, 再用delims處理就可以了

用6F下面那樣寫的就可以應付有空格的%1



點評

是 if 不用再加引號啦 (單雙都不用)  發表於 2020-6-19 22:45
了解 看來不論是批次本身和被讀取的檔案 為了確保可能含空白的絕對路徑可以正確啟動 還是用單引號讓if正確辨識字串比較好  發表於 2020-6-19 22:41

使用道具

該用戶從未簽到

升級   50.5%

 樓主| 發表於 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-3-29 22:02

Discuz! X

© 2009-2023 Microduo

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