![簡單批次檔在 Windows Server 2012 上失敗](https://rvso.com/image/1413938/%E7%B0%A1%E5%96%AE%E6%89%B9%E6%AC%A1%E6%AA%94%E5%9C%A8%20Windows%20Server%202012%20%E4%B8%8A%E5%A4%B1%E6%95%97.png)
在 Windows 2012 Server 上,從登入的管理員(本機和網域)透過將控制台輸入重定向到檔案來建立批次檔「test.bat」:
echo Hello
當從 PowerShell cmd 提示字元執行時.\test.bat
,它會回顯:
'■e' is not recognized as an internal or external command,
批次檔位於登入使用者的 C:\users\%username% 目錄中。
該文件是從控制台建立的,因此:
echo "echo Hello" > test.bat
然後用記事本編輯。在記事本中看起來不錯...沒有什麼異常。
對發生的事情有什麼想法嗎?
編輯:
根據建議,我修改了命令列輸入以刪除引號。因此,輸入這樣的命令:echo echo Yowzer > test.bat
Ran as:.\test.bat
並得到與上面相同的回應。另請注意,如果我在記事本中編輯上述 test.bat (即在命令列建立)並重新運行,它仍然會傳回垃圾回應。但是,如果我在記事本中建立/儲存文件從頭開始,它工作正常。
任何人都可以複製這個嗎?
答案1
看起來重定向>
已將您的批次檔編碼為 unicode,而它應該是 ascii。在 Powershell 中,使用Out-File
而不是像這樣的重定向:
"echo test" | Out-File test.bat -Encoding ascii
在以下編碼後執行批次檔將重現錯誤:
"echo test" | Out-File test.bat -Encoding unicode
答案2
有同樣的問題,我以為我瘋了。
在另一台計算機上製作批次檔。我打開記事本並正常輸入命令時遇到了同樣的問題。它總是給我同樣的訊息。一旦我在本機 Win7 裝置上重新建立批次檔(不要複製舊檔案),將其複製回我的 Win 2012R2 伺服器,工作起來就像冠軍一樣。
答案3
你很可能在某個地方有一些有趣的個性。我非常確定,如果您xxd -p blah.bat
這樣做,您會在批次檔中看到一些有趣的字元。
然後你可以考慮它們是如何到達那裡的,並刪除它們..這可以使用 xxd 和 sed 來完成。或者也許另一種方式,如果你知道它們是什麼角色的話。
您可以透過下載 VIM 7.X 或 cygwin 取得 xxd
或者您可以找到一個十六進位編輯器並將批次檔放入十六進位編輯器中。
你說你正在從標準輸入創建批次檔..那麼,你可以詳細說明你的意思,例如你的意思是copy con blah.bat
CTRL-Z嗎?但無論你的意思是什麼,它都會在文件中放入一些有趣的字元。
添加
我看到你說你是用回顯和重定向來做到這一點的。
您可以輕鬆簡化此操作以進行一些故障排除
嘗試 type blah.bat
如果這顯示了一個有趣的角色,那麼請嘗試
echo H>blah.bat
將其構建為您輸入的內容......然後看看您在什麼時候獲得有趣的角色。
另一個需要實驗的是輸入和輸出編碼
嘗試 chcp。 chcp 850 和 chcp 65001 並查看是否發現任何差異。 chcp 將更改輸入和輸出編碼,但 chcp 只會顯示輸入編碼。
如果你在這裡看我的回答https://stackoverflow.com/questions/30904504/font-is-right-why-cant-i-get-this-unicode-character-to-display-in-this-c-sharp/32418703#32418703 你會看到我不久前編寫的一個名為 chcpa 的程序,你可以使用它比 chcp 更靈活地更改輸入和輸出編碼。或者您可以只使用 chcp,但如果您發現 chcp 限制了您的故障排除,那麼您可以嘗試 chcpa。
但是,在故障排除中最好的工具之一是十六進位編輯器或前面提到的 xxd。並按照建議進一步簡化您的生產線。
類似的步驟將幫助您找出錯誤所在。當您在這裡或進一步嘗試任何內容時,請發表評論。