繁体   English   中英

如何在cmd中设置一个变量,该变量是来自powershell命令结果的字符串?

[英]How to set a variable in cmd which is a string from powershell command result?

我想将powershell命令的结果存储在cmd变量中作为String: powershell -com "(ls | select -Last 1).FullName" 这个怎么做?

CMD没有将命令输出分配给变量的直接方法。 如果命令仅产生一行,则可以使用for循环

for /f "delims=" %a in ('some_command /to /run') do @set "var=%a"

但是,如果命令产生多行,则仅捕获最后一行。 更好的方法是将命令的输出重定向到文件,然后将该文件读入变量:

set "tempfile=C:\temp\out.txt"
>"%tempfile%" some_command /to /run
set /p var=<"%tempfile%"
del /q "%tempfile%"

但是,如果您只需要目录中的最后一个文件,则无需运行PowerShell。 CMD本身可以做的很多事情:

for /f "delims=" %f in ('dir /a-d /b') do @set "var=%~ff"

请注意,从批处理文件运行此字符时,需要将%字符加倍。

FOR循环可以提供文件的路径。 如果不需要默认目录排序顺序,请在DIR命令上指定其他命令行开关。

FOR /F "delims=" %F IN ('DIR /B') DO (SET "THE_FILE=%~fF")
ECHO THE_FILE is "%THE_FILE%"

在.bat文件脚本中,将FOR循环变量的百分比字符加倍。

FOR /F "delims=" %%F IN ('DIR /B') DO (SET "THE_FILE=%%~fF")
ECHO THE_FILE is "%THE_FILE%"

.bat文件脚本也可以运行PowerShell脚本。 最佳实践是在脚本中不要使用别名,例如ls

FOR /F "delims=" %%F IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-ChildItem -File | Select-Object -Last 1).FullName"') DO (SET "THE_FILE=%%~fF")
ECHO THE_FILE is "%THE_FILE%"

cmd的问题在于,我想获取不递归的文件夹的完整路径...此dir / ad / b不提供完整路径,而此dir / ad / b / s递归地提供... – stakowerflol 2小时前

没问题,您可以返回完整文件路径而无需递归。

如果要将目录更改为需要检查的路径,则它将存储在%CD%

如果您需要脚本的路径,则脚本本身存储在%~dp0

如果您想提供一个参数来指定任意路径并获取所有列表,它将是该参数项(EG %~1

使用所有三个可能的选项,您可以执行相同的操作:

要么

将提供的变量放在所选目录枚举方法的输出之前

要么

使用For循环获取该路径下的文件名,并显示具有完整路径的结果。

IE浏览器

詹金斯_A_Dir.bat

@(
  SETLOCAL
  ECHO OFF
  SET "_Last="
  ECHO.%~1 | FIND /I ":\" > NUL && (
   SET "_CheckHere=%~1"
  )
  IF NOT DEFINED _CheckHere (
    SET "_CheckHere=C:\Default\Path\When\No Argument\Specified"
  )
)

REM Use a For loop to get everything in one variable

FOR %%A IN (
  "%_CheckHere%\*"
) DO (
  SET "_Last=%%A"
)
ECHO.Found "%_Last%"


REM Use `FOR /F` with DIR, and append the path to Check:

SET "_Last="
FOR /F "Tokens=*" %%A IN ('
  DIR /A-D /B "%_CheckHere%\*"
') DO (
  SET "_Last=%_CheckHere%\%%A"
)
ECHO.Found "%_Last%"

当然,您不需要设置诸如_CheckHere这样的变量

相反,您可以只将%_CheckHere%所有实例替换为`%〜1,在上面的示例中也可以正常工作。

好的,如果您只是想查看脚本运行的位置。

然后要么改变上述使用SET "_CheckHere=%~dp0"或替换%_CheckHere%%~dp0贯穿。

好的,但是如果您不想设置变量,则希望它使用当前工作目录。

那时,甚至更容易:

Jenkins_Current_Dir.bat

@(
  SETLOCAL
  ECHO OFF
  SET "_Last="
)

REM Use a For loop to get everything in one variable

FOR %%A IN (
  "*"
) DO (
  SET "_Last=%%~fA"
)
ECHO.Found "%_Last%"


REM Use `FOR /F` with DIR, and let it append the current working directory to the path:

SET "_Last="
FOR /F "Tokens=*" %%A IN ('
  DIR /A-D /B "*"
') DO (
  SET "_Last=%%~fA"
)
ECHO.Found "%_Last%"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM