gpt4 book ai didi

windows - 尝试使用 powershell 将日志文件的最后 10 行连接到批处理变量

转载 作者:行者123 更新时间:2023-12-04 14:46:34 24 4
gpt4 key购买 nike

我是 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%

我使用子字符串的原因是因为日志文件中的某些行以 < 和 > 开头。我以为那是我唯一的问题,但事实并非如此。如果需要更多信息,请告诉我。谢谢!

最佳答案

注意:您的 own answer显示了有效的解决方案,但我想我会提供一些背景信息。

Squashman提供了关键指针:

  • echo %LAST_TEN% 切换至 echo !LAST_TEN!避免变量 value 中的元字符(特殊字符,如 <>)出现问题,这是导致错误消息的原因。

  • 替代方法是双引号变量引用 - echo "%LAST_TEN%" - 但是,遗憾的是,双引号随后被包含在输出中

换句话说:如果你需要echo (可能)包含元字符的变量的值 unquoted:

  • 放置 setlocal EnableDelayedExpansion 在批处理文件的开头。

  • 然后将感兴趣的变量引用为!VAR! 而不是 %VAR% :延迟扩展这会导致值成为cmd.exe 的源代码行的一部分解析(由于 %VAR% 发生的宏式前期扩展)。

    • 顺便说一句:循环变量——比如%%x在你的代码中 - 尽管使用了 %而不是 !作为分隔符,必须总是延迟的方式扩展,这就是set LAST_TEN=!LAST_TEN!%%x的原因甚至在没有双引号包围变量名和值的情况下也能工作,这通常是文字和包含元字符的延迟变量引用(例如
      set "LAST_TEN=a < b" )

一个简化的例子:

@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 .逃离 !应逐字使用的 literal 字符串中的字符,您需要 ^^! (sic) 在 unquoted 字符串中,和 ^!里面"..." .

%...% 也需要转义变量引用(例如 echo %var:!=^^!% ),但再次避免使用 !...!

为了避免这种令人头疼的逃避问题,您可以启用 setlocal enableDelayedExpansion 按需,对于给定的行或行 block ,并使用 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然后丢弃,不要尝试在setlocal之间设置变量和 endlocal如果您需要稍后的代码来查看这些更改。

关于windows - 尝试使用 powershell 将日志文件的最后 10 行连接到批处理变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69904441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com