2016-02-03 121 views
1

我需要使用以下條件創建Windows「批處理」文件。 將文本轉換爲md5sum值 我試着用下面的.bat文件。但不工作將文本轉換爲md5sum值的批處理文件

@echo off 

setlocal ENABLEDELAYEDEXPANSION 

set hashmd5=$(echo -n welcome1 | md5sum | cut -c 1-32); 

printpass=$printpass"#####MD5: echo.%%hashmd5 "\n" 
+1

您可能會發現[這個答案](http://stackoverflow.com/a/29216039/1683264)是有用的。 – rojo

回答

1

檢查MD5.bat

@echo off 
set "string=The quick brown fox jumps over the lazy dog" 
(break|set/p=%string%)>~ 
call md5 ~ m5sting 
echo %m5sting% 
exit /b 0 

雖然無論我做什麼我不能得到相同的結果,從字符串轉換爲MD5一些在線工具(但他們往往各不相同)。這將始終將EOF字符放在字符串的末尾,因爲它會轉換文件而不是純字符串。

目前上面的腳本給出了相同的結果(在Rojo的評論看出) powershell "[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes('%string%')) | %%{write-host -n $_.tostring('x2')}"雖然還是從PHP和一些JavaScript庫

1

下面是另一個版本,也使用certutil生成MD5哈希不同。它會給你一個文件或一個字符串參數的MD5sum,並且可以通過管道接受一行輸入。該解決方案不依賴於隨附的幫助程序腳本。

@echo off & setlocal 

set "plaintext=%~1" 
set "file=%temp%\%~n0.tmp" 
set md5= 

if "%~1"=="/?" (
    echo Usage: %~nx0 file^|string 
    echo or: command ^| %~nx0 
    echo; 
    echo Example: set /P "=password" ^<NUL ^| %~nx0 
    goto :EOF 
) 

if not defined plaintext set /P "plaintext=" 

if exist "%plaintext%" (
    set "file=%plaintext%" 
) else for %%I in ("%file%") do if %%~zI equ 0 (
    <NUL >"%file%" set /P "=%plaintext%" 
) 

for /f "skip=1 delims=" %%I in ('certutil -hashfile "%file%" MD5') do (
    if not defined md5 set "md5=%%I" 
) 

2>NUL del "%temp%\%~n0.tmp" 

echo %md5: =% 

只是因爲我覺得自己的挑戰,這裏的另一個版本,可以接受通過管道從文件重定向多條線路,以及輸入。 (這是不容易防止StdIn.AtEndOfStream從鍵盤輸入提示當緩衝區是空的。)

@if (@CodeSection == @Batch) @then 
@echo off & setlocal & goto main 

:usage 
echo Usage: %~nx0 file^|string 
echo or: command ^| %~nx0 
echo or: %~nx0 ^< file 
echo; 
echo Example: set /P "=password" ^<NUL ^| %~nx0 
goto :EOF 

:main 
set "plaintext=%~1" 
set "file=%temp%\%~n0.tmp" 
set md5= 

rem // check for input via the pipeline; timeout nearly instantly if none 
start /b "" cscript /nologo /e:JScript "%~f0" "%file%" watcher 
cscript /nologo /e:JScript "%~f0" "%file%" 

if "%~1"=="" for %%I in ("%file%") do if %%~zI equ 0 goto usage 
if "%~1"=="/?" goto usage 

if not defined plaintext set /P "plaintext=" 

if exist "%plaintext%" (
    set "file=%plaintext%" 
) else for %%I in ("%file%") do if %%~zI equ 0 (
    <NUL >"%file%" set /P "=%plaintext%" 
) 

for /f "skip=1 delims=" %%I in ('certutil -hashfile "%file%" MD5') do (
    if not defined md5 set "md5=%%I" 
) 

2>NUL del "%temp%\%~n0.tmp" 

echo %md5: =% 
goto :EOF 

@end // end Batch/begin JScript hybrid code 

var fso = WSH.CreateObject('scripting.filesystemobject'); 
if (WSH.Arguments.Length > 1) { 
    WSH.Sleep(1); 
    if (!fso.FileExists(WSH.Arguments(0))) 
     WSH.CreateObject('WScript.Shell').Exec('taskkill /im "cscript.exe" /f'); 
} else if (!WSH.StdIn.AtEndOfStream) { 
    var file = fso.CreateTextFile(WSH.Arguments(0), 1); 
    file.Write(WSH.StdIn.ReadAll()); 
    file.Close(); 
} 
+1

不錯,謝謝。只需要注意,爲了讓你的第一個例子工作,我不得不作出兩個小的改變: 1.第11行:'echo示例:set/P「=密碼」^

+0

@EricG謝謝。我添加了你的建議編輯。 – rojo

相關問題