[英]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浏览器
@(
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
贯穿。
好的,但是如果您不想设置变量,则希望它使用当前工作目录。
那时,甚至更容易:
@(
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.