Что не так с этой строкой кода в моем пакетном скрипте? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь назначить свободное место на диске C: переменной с помощью этой команды, и я не могу заставить ее работать должным образом.

For /f "tokens=3" %%A IN ('powershell -noprofile -command "get-WmiObject win32_logicaldisk -Filter \"DeviceID = 'C:'"" ^| Find "FreeSpace"') DO Set _FreeSpace=%%A

Это не ' присваивать переменной что угодно. При запуске сценария powershell непосредственно внутри ISE он дает ожидаемый результат. И запуск кода в скобках внутри CMD напрямую (изменение ^ | на |) также работает нормально.

Я уверен, что упускаю что-то очевидное, так как это мой первый раз, когда я действительно вхожу в For Команды, но любая помощь будет принята с благодарностью!

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Трудно заставить все эти одинарные и двойные кавычки работать с powershell, а затем внутри a для l oop. Кажется, это работает для меня:

setlocal enabledelayedexpansion
set "_cmdToRun=powershell -noprofile -command "get-WmiObject win32_logicaldisk -Filter \"DeviceID = 'C:'"""
For /f "tokens=3" %%A IN ('!_cmdToRun! ^| Find "FreeSpace"') DO Set _FreeSpace=%%A
1 голос
/ 01 февраля 2020

Поскольку = является стандартным разделителем токенов в cmd.exe, так же как и SPACE , вам нужно правильно экранировать его (обратите внимание, что \ не является чем-то особенным для cmd.exe, поэтому = появляется без кавычек):

for /F "tokens=3" %%A in ('powershell -noprofile -command "get-WmiObject win32_logicaldisk -Filter \"DeviceID ^= 'C:'\"" ^| Find "FreeSpace"') do set "_FreeSpace=%%A"
0 голосов
/ 01 февраля 2020

Я бы предложил эту альтернативу, которая дополнительно предоставит результат в ГБ:

@For /F "Delims=" %%G In ('Powershell -NoP^
 "gWMI Win32_LogicalDisk -F \""DeviceID='C:'\""|"^
 "%%{[Math]::Round($_.FreeSpace/1GB,2)}"'
)Do @Set "FDS=%%G"
@Echo Freespace on C: is %FDS%GB
@Timeout -1

или проще:

@For /F "Delims=" %%G In ('Powershell -NoP^
 "[Math]::Round($(gWMI Win32_LogicalDisk -F \""DeviceID='C:'\"").FreeSpace/1GB,2)"
')Do @Set "FDS=%%G"
@Echo Freespace on C: is %FDS%GB
@Timeout -1



На основании вашего комментария Если вы хотите, чтобы это было в байтах, вы можете использовать:
@For /F "Delims=" %%G In ('Powershell -NoP^
 "gWMI Win32_LogicalDisk -F \""DeviceID='C:'\""|Select -Exp FreeSpace"
')Do @Set "FDS=%%G"
@Echo Freespace on C: is %FDS%bytes
@Timeout -1

или более простое:

@For /F "Delims=" %%G In ('Powershell -NoP^
 "(gWMI Win32_LogicalDisk -F \""DeviceID='C:'\"").FreeSpace"
')Do @Set "FDS=%%G"
@Echo Freespace on C: is %FDS%bytes
@Timeout -1
...