英文:
How can I run cmd commands inside a PowerShell session?
问题
无法在PowerShell会话中运行cmd命令,尽管我在命令本身之前键入了"cmd /c",如下所示,我收到了以下错误:
PS C:\Program Files (x86)\FireEye\xagt> cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
cmd : 无法解析参数:95319.txt
At line:1 char:1
+ cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (无法解析参数:95319.txt:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
如果我在cmd控制台会话中运行以下命令,如下所示,我得到了成功的结果,即在c:\tmp中生成了名为"xagt_servername_20232405_151403.txt"的文件,此命令生成了一个具有名称"xagt_servername_date_serialnumber"的日志文件:
C:\Program Files (x86)\FireEye\xagt\xagt.exe" -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
成功
奇怪的是,如果我在cmd控制台会话中运行完命令后,在PowerShell中运行以下脚本,cmd在PowerShell中成功运行,并在c:\tmp中生成另一个日志文件:
PowerShell脚本如下:
Write-Host "----------------------------------------"
Write-Host ""##############Microsoft Fireeye Info###############""
Write-Host "----------------------------------------`r`n"
Get-ChildItem -Path 'HKLM:\SOFTWARE\Wow6432Node\microsoft\Windows\CurrentVersion\Uninstall' | Get-ItemProperty | where {$_.DisplayName -like 'FireEye Endpoint Agent'} | Select DisplayName, Publisher, InstallDate,DisplayVersion
cd "C:\Program Files (x86)\FireEye\xagt\"
cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
我没有收到错误消息,并且在c:\tmp中创建了另一个日志文件。我不知道为什么它在第一次尝试时不起作用。
我尝试使用以下命令在PowerShell中运行cmd命令:
Start-Process -FilePath "xagt.exe" -WorkingDirectory "C:\Program Files (x86)\FireEye\xagt\" -ArgumentList "-g","`C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt`""
但它没有按预期生成日志文件。
我还尝试了:
PS C:\Program Files (x86)\FireEye\xagt> .\xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
.\xagt.exe : 错误:-4058
At line:1 char:1
+ .\xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%d ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (错误:-4058:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
另一个尝试:
PS C:\Program Files (x86)\FireEye\xagt> cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
cmd : 无法解析参数:95319.txt
At line:1 char:1
+ cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (无法解析参数:95319.txt:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
英文:
I can't run cmd command inside PowerShell session although I type "cmd /c" before the command itself as shown below I got the following error:
PS C:\Program Files (x86)\FireEye\xagt> cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
cmd : Fail to parse the argument: 95319.txt
At line:1 char:1
+ cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Fail to parse the argument: 95319.txt:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
If I run the following command in cmd console session as shown below, I got a successful result that a file named "xagt_servername_20232405_151403.txt" has been generated in c:\tmp, this command generates a log file that has the name "xagt_servername_date_serialnumber"
C:\Program Files (x86)\FireEye\xagt\xagt.exe" -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
success
The strange thing is, if I run the following script using PowerShell after I have run the command in cmd console session, the cmd inside the PowerShell run successfully and generate another log file in c:\tmp
The PowerShell script as follows:
Write-Host "----------------------------------------"
Write-Host ""##############Microsoft Fireeye Info###############""
Write-Host "----------------------------------------`r`n"
Get-ChildItem -Path 'HKLM:\SOFTWARE\Wow6432Node\microsoft\Windows\CurrentVersion\Uninstall' | Get-ItemProperty | where {$_.DisplayName -like 'FireEye Endpoint Agent'} | Select DisplayName, Publisher, InstallDate,DisplayVersion
cd "C:\Program Files (x86)\FireEye\xagt\"
cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
I got no errors and another log file is created in c:\tmp. I don't know why it doesn't work from the first attempt.
I try to run cmd commands usig PowerShell using the following:
Start-Process -FilePath "xagt.exe" -WorkingDirectory "C:\Program Files (x86)\FireEye\xagt\" -ArgumentList "-g","`C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt`""
But it didn't generate the log file as expected.
I also tried:
PS C:\Program Files (x86)\FireEye\xagt> .\xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
.\xagt.exe : Error: -4058
At line:1 char:1
+ .\xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%d ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Error: -4058:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Another try:
PS C:\Program Files (x86)\FireEye\xagt> cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
cmd : Fail to parse the argument: 95319.txt
At line:1 char:1
+ cmd /c xagt.exe -g "C:\tmp\xagt_%computername%_%date:~-4,4%%date:~-10 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Fail to parse the argument: 95319.txt:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
答案1
得分: 4
<!-- language-all: sh -->
评论中提供了很有价值的信息,[JosefZ](https://stackoverflow.com/users/3439404/josefz) 提供了关键指示:您的命令失败,因为 cmd.exe 的动态 `%TIME%` 变量对于所有单个数字(上午)的小时都有一个_前导空格_,例如 ` 9:29:16.15`;这个空格导致传递了一个_额外的参数_。
让我添加一个仅使用 PowerShell 的解决方案,可以绕过您的问题,而且更简单和更高效,因为您不需要通过 `cmd.exe` 调用:
```powershell
xagt.exe -g "C:\tmp\xagt_${env:COMPUTERNAME}_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
上面的命令使用了:
-
一个可展开(双引号引用)的 PowerShell 字符串(
"..."
),其中可以嵌入变量引用,例如环境变量引用$env:COMPUTERNAME
,以及通过$(...)
嵌入的命令和表达式,例如Get-Date
调用。 -
调用
Get-Date
cmdlet,带有其-Format
参数,允许您按所需的方式格式化日期和时间,例如通过自定义日期和时间格式字符串。- 请注意,使用
HH
表示一天中的小时会导致一位数字小时左侧填充为0
,例如09
,并且 PM 小时会以 24 小时制表示,例如 3 PM 为15
。
- 请注意,使用
<details>
<summary>英文:</summary>
<!-- language-all: sh -->
There's great information in the comments, and [JosefZ](https://stackoverflow.com/users/3439404/josefz) has provided the crucial pointer: your command failed, because cmd.exe's dynamic `%TIME%` variable has a _leading space_ for all single-digit (morning) hours; e.g. ` 9:29:16.15`; this space caused an _extra argument_ to be passed.
Let me add a PowerShell-only solution that bypasses your problem and is both simpler and more efficient, given that you don't need to call via `cmd.exe`:
xagt.exe -g "C:\tmp\xagt_${env:COMPUTERNAME}_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
The above uses:
* an [expandable (double-quoted) PowerShell string (`"..."`)](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Quoting_Rules#double-quoted-strings), in which variable references - such as environment-variable reference `$env:COMPUTERNAME` - can be embedded, as well as, via `$(...)`, commands and expressions, such as the `Get-Date` call.
* a call to the [`Get-Date`](https://learn.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Get-Date) cmdlet with its `-Format` parameter, which allows you to format a date and time as desired, such as via [custom date and time format strings](https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings).
* Note that the use of `HH` for the hour of the day causes single-digit hours to be left-padded with a `0`, e.g. `09`, and PM hours to be expressed in 24-hour format, e.g. `15` for 3 PM.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论