我寫了一個bat檔案通過keytool生成一個keystore。我的代碼是:
cd C:\Java\jdk-11.0.1\bin
set Pass=12345678
set RepetitionPass=test
set FLname=test
set OrganUnit=test
set Organ=test
set City=test
set State=test
set Country=US
set Pass=%Pass: =%
set RepetitionPass=%RepetitionPass: =%
set FLname=%FLname: =%
set OrganUnit=%OrganUnit: =%
set Organ=%Organ: =%
set City=%City: =%
set State=%State: =%
set Pass=%Pass: =%
set Country=%Country: =%
(echo.%Pass% && echo.%RepetitionPass% && echo.%FLname% && echo.%OrganUnit% && echo.%Organ% && echo.%City% && echo.%State% && echo.%Country% && echo y)| keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
pause
我將此代碼放在記事本中,然后將其擴展名更改為 .bat。一切正常 我唯一的問題是自動添加了空格密碼的結尾。例如,如果我的密碼是“12345678”,那么在生成密鑰時,它的密碼就是“12345678”。出于某種原因,我不想使用 Android Studio 生成密鑰,我必須以這種方式生成我的密鑰庫。問題出在哪里?我該如何解決這個問題?
uj5u.com熱心網友回復:
Windows 命令提示符對 相當敏感SPACEs,因此當您提供此類時,它們可能會產生一些影響。例如:echo foo & echo bar將輸出一行foo SPACE和一行bar(當然,假設沒有“不可見”SPACE的尾隨)。
但是手頭的情況更加復雜:|批處理腳本中有一個管道 ( ),它將cmd.exe為左側啟動一個新實體,因為有一個帶括號的塊1;SPACEs這個新實體接收到以某種方式重建的左側代碼,因此插入了更多不需要的代碼。回到前面的例子,甚至會回傳兩行,每(echo foo&echo bar) | more行都有一個尾隨2,因為左命令將被重建為類似.SPACE( echo foo & echo bar )
即使以下內容仍將回傳SPACE每行的尾隨:
(
echo foo
echo bar
) | more
因為左側的命令塊將再次重建為類似( echo foo & echo bar ).
一種可能的解決方案是轉義& 符號,因此它會直接傳遞給新cmd.exe實體而無需修改:
(echo foo^& echo bar) | more
顯然,這只會阻止第一行附加 a SPACE,但是當我們附加另一個轉義的 & 號加上一個字面上什么都不做的命令時,比如3,解決方案是完整的:rem/
(echo foo^& echo bar^& rem/) | more
同樣的方法也可以應用于塊方法:
(
echo foo^& rem/
echo bar^& rem/
) | more
最終會被翻譯成類似( echo foo& rem/ & echo bar& rem/ ).
現在讓我們將它應用到您的代碼中,以及另外一些更改:
- 該
cd命令也需要該/D選項才能更改當前驅動器,并且參考路徑通常是一個好習慣。還要考慮當路徑不存在或由于某種原因無法訪問時該怎么做(條件執行&&或||可能在這里服務)。 - 為了保護特殊字符并避免不必要的尾隨,您通常應該更喜歡
set命令的參考語法,例如set "Pass=12345678"而不是。set Pass=12345678SPACEs - 我完全跳過了洗掉的代碼塊SPACEs,因為我認為這只是嘗試洗掉SPACEs輸出中不需要的內容的失敗嘗試(如果你確實想要那個塊,你應該使用帶引號的語法,
set "Pass=%Pass: =%"而不是set Pass=%Pass: =%)。 - 盡管被廣泛使用,但它是回顯(可能)空行的一種不好的方式,因為在執行內部命令之前實際上會搜索
echo.呼叫的檔案。如果由于某種原因存在這樣的檔案,則會嘗試執行它。因此,使用看起來很奇怪但安全的語法。echo.echoecho( - 您不需要條件執行來鏈接
echo命令,無條件&運算子就可以了。
所以這里是可能固定的代碼:
@echo off
cd /D "C:\Java\jdk-11.0.1\bin" || exit /B
set "Pass=12345678"
set "RepetitionPass=test"
set "FLname=test"
set "OrganUnit=test"
set "Organ=test"
set "City=test"
set "State=test"
set "Country=US"
(
echo(%Pass%^& rem/
echo(%RepetitionPass%^& rem/
echo(%FLname%^& rem/
echo(%OrganUnit%^& rem/
echo(%Organ%^& rem/
echo(%City%^& rem/
echo(%State%^& rem/
echo(%Country%^& rem/
echo y^& rem/
) | keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
pause
1) For a detailed explanation refer to this post: How does the Windows Command Interpreter (CMD.EXE) parse scripts? (see phase 5.3)
2) Write the output into a file using output redirection (>) in order to prove it.
3) It has to be rem/ and not rem, because the latter would comment out the whole remainder of the command line.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430816.html
