我是 Windows 腳本的新手,但在 bash 和 python 方面有很多經驗。
這是問題。每當我運行它時(這是我迄今為止得到的最好結果),它大部分時間都會通過,然后出現“檔案名、目錄名或卷標語法不正確”的錯誤。
忽略為換行符設計的代碼,我仍然在與它作斗爭。
setlocal EnableDelayedExpansion
set LF=^
set LAST_TEN=Here are the last 10 lines of the download log:
for /f "tokens=* usebackq" %%x in (`powershell -command "& {Get-Content download.log | Select-Object -last 10 | ForEach-Object {$_.substring(2)}}"`) do (
set LAST_TEN=!LAST_TEN!%%x
)
echo %LAST_TEN%
我采用子字??符串的原因是因為日志檔案中的某些行以 < 和 > 開頭。我以為這是我唯一的問題,但事實并非如此。如果需要更多資訊,請告訴我。謝謝!
uj5u.com熱心網友回復:
改變了
echo %LAST_TEN%
到
echo !LAST_TEN!
uj5u.com熱心網友回復:
注意:您自己的答案顯示了有效的解決方案,但我想我會提供一些背景資訊。
Squashman提供了關鍵的指標:
切換
echo %LAST_TEN%到echo !LAST_TEN!避免了變數value中元字符(特殊字符,如<和>)的問題。另一種方法是雙引號參考變數
echo "%LAST_TEN%"- 但遺憾的是,雙引號隨后包含在輸出中。
換句話說:如果您需要echo(可能)包含未加引號的元字符的變數的值:
- 放置
setlocal EnableDelayedExpansion在您的批處理檔案的開始。 - 然后將感興趣的變數參考為
!VAR!而不是%VAR%:這導致的延遲擴展阻止該值成為cmd.exe決議的源代碼行的一部分(由于與 一起發生的宏樣式預先擴展%VAR%)。
一個簡化的例子:
@echo off
setlocal enableDelayedExpansion
:: Define a sample variable
:: Note the "..." enclosing both the name and the value.
set "var=a value with metacharacters: < > & |"
:: Thanks to using !var!, echoing the value *unquoted* works
echo !var!
范圍啟用setlocal enableDelayedExpansion:
延遲擴展的一個陷阱是所有 !字符都被認為是延遲變數參考的一部分,通常會導致它們被悄悄洗掉;例如,echo hi!輸出只是hi。要轉義 應該逐字使用的文字字串中的!字符,您需要(sic) 在不帶引號的字串中,并在.^^!^!"..."
%...%變數參考(例如,echo %var:!=^^!%)也需要轉義,但對于變數參考再次避免!...!。
為了避免這種逃避的麻煩,您可以setlocal enableDelayedExpansion 按需啟用,對于給定的行或行塊,然后再次禁用它endlocal:
@echo off
:: Define a sample variable
:: Note the "..." enclosing both the name and the value.
set "var=a value with metacharacters: < > & |"
:: Because setlocal enableDelayedExpansion is NOT (yet)
: in effect, the use of "!" is not a problem.
echo hi!
:: Localize the use of delayed expansion
setlocal enableDelayedExpansion
echo !var!
endlocal
:: Use of "!" is again fine.
echo hi again!
警告:由于setlocal創建了環境變數的副本,endlocal然后丟棄了,如果您需要稍后的代碼來查看這些更改,請不要嘗試在和之間設定變數。setlocalendlocal
uj5u.com熱心網友回復:
既然您已經在使用 PowerShell,為什么不讓它完成作業呢?
抓取最后十行并將它們連接在括號內,例如:
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Get-Content 'download.log' | Select-Object -Last 10) -Join ''"') Do Set "LAST_TEN=%%G"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/354745.html
