【问题标题】:How to return value of command line variable to immediate window如何将命令行变量的值返回到即时窗口
【发布时间】:2018-10-04 10:37:40
【问题描述】:

情况:

我想从 Windows 命令提示符返回字符串变量的实际值。

命令

cd C:\Users\User\Desktop\Testfolder && (for /f "eol=: delims=" %F in ('dir /b /od *.csv') do @set "newest=%F" ) && echo %newest%

在命令提示符窗口中执行时,正确返回值,例如"Test2.csv"

在下面的代码中,我无法将此值返回到 Excel 中的即时窗口;相反,我得到了我发出的命令,即"%newest%"

代码:

Public Sub Test
    Debug.Print CreateObject("wscript.shell").exec("cmd /c cd C:\Users\User\Desktop\Testfolder && (for /f ""eol=: delims="" %F in ('dir /b /od *.csv') do @set ""newest=%F"" ) && echo %newest%").StdOut.ReadAll
End Sub

命令提示符窗口中的结果:

立即窗口中的结果:

我尝试过的:

查看了大量资源;我在最后的参考资料中列出了其中一些。各种尝试包括:

1) 我曾尝试逃跑,但没想到会成功:

echo %%newest%%   '<==== give %Test2.csv%  in CLI and %%newest%% in immediate

2) 添加等待,例如:

Debug.Print CreateObject("wscript.shell").exec("cmd /c cd C:\Users\User\Desktop\Testfolder && (for /f ""eol=: delims="" %F in ('dir /b /od *.csv') do @set ""newest=%F"" ) && PING localhost -n 2 >NUL && echo %newest%").StdOut.ReadAll

3) 管道传输到文本文件并回读:

 CreateObject("wscript.shell").exec ("cmd /c cd C:\Users\User\Desktop\Testfolder && (for /f ""eol=: delims="" %F in ('dir /b /od *.csv') do @set ""newest=%F"" )&& echo %newest% > C:\Users\User\Desktop\Testfolder\fileInfo.txt") '.StdOut.ReadAll
 Debug.Print CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\UsersUser\Desktop\Testfolder\fileInfo.txt", ForReading).ReadAll

在上一个示例中,有一次将实际值写入文件,但之后继续写入"%newest%"

显然我没有从命令行获取执行语句的结果。

请问如何返回实际值?

其他信息:

这是一系列切换到指定目录的命令;循环遍历该文件夹中的 csv 文件;查找最近修改的文件并返回其名称。

参考资料:

  1. Get Return Value of Shellexecute
  2. Reading output from shell
  3. Setting and using variable within same command line in windows cmd
  4. Scripting - Waits

【问题讨论】:

  • 使用环境变量扩展标志:CMD /V /C set a=1234 &amp; echo !a!
  • @FlorentB 太棒了,请作为答案发布,我会接受。

标签: vba excel command-line command-prompt


【解决方案1】:

因此感谢@FlorentB 使用环境变量扩展标志的答案。这并入最终答案中,给出了以下内容,它返回了指定目录中最后修改文件的文件名。

CreateObject("wscript.shell").exec("cmd /V /C cd " & myDir & " && (for /f ""eol=: delims="" %F in ('dir /b /od *.csv') do @set ""newest=%F"" ) && echo !newest!").StdOut.ReadAll

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2022-12-19
    • 2013-09-15
    相关资源
    最近更新 更多