如何以这样的格式导出到 CSV datetime;hostname;username1;username2;
How to export to CSV in format like this datetime;hostname;username1;username2;
请帮助我将某些内容解析为 CSV。我已经知道如何使用 Powershell 来完成,但我需要使用批处理文件。
我需要得到这样的输出:
datetime;hostname;username1;username2;
其中 username1
username2
等是本地管理员组的用户名。
我做了这个:
@echo off
echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%
for /f "tokens=* skip=6" %%a in ('net localgroup Administrators') do (
echo %%a >> "c:\temp\%datetimef%.csv")
pause
然而输出文件名是:
2021_ 1_Fr__11_42_18.csv
返回的日期是:
Administrator
Usr1
The command completed successfully
如何从生成的输出文件中删除 The command completed successfully
?
我想你想要这样的东西?
@echo off
setlocal enabledelayedexpansion
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
set "var=%datetimef%"
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do set "var=!var!;%%a"
(echo %var%)>>"c:\temp\%datetimef%.csv"
谢谢大家!最后我在你的帮助下解决了这个问题:
@echo off
setlocal enabledelayedexpansion
rem set mydate=%:/date:/=%
rem set mytime=%time::=%
rem set mytimestamp=%mydate: =_%_%mytime:.=_%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
set mytimestamp=%mydate%_%mytime%
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do (
set param=!param!%%a;)
echo %mytimestamp%;%computername%;!param! >> "c:\temp\%mydate%.csv"
您报告的输出的主要问题是,它似乎假设了您的 %DATE%
和 %TIME%
变量的返回输出。这些值可以针对语言环境、机器 and/or 登录用户进行不同的配置,并且在您的情况下不匹配 dd#MM#yyyy
的 %DATE%
假设,(其中 #
代表项目分隔符)。你的显然是 ddd d#M#yyyy
、ddd dd#MM#yyyy
、ddd M#d#yyyy
。或 ddd MM#dd#yyyy
此站点上已有许多问题和答案显示使用 none 语言环境或其他配置格式获取日期和时间的方法,最有用的非 PowerShell 方法使用内置-在 WMIC.exe 实用程序中。
只是为了一些不同的东西,即根本不使用 net.exe,而是使用 WMIC.exe:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get CSName^,LocalDateTime /Format:MOF 2^>NUL') Do If Not Defined { (Set "{=%%G") Else (SetLocal EnableDelayedExpansion
Set "}=%%G"
For %%H In ("!}:~,4!_!}:~4,2!_!}:~6,2!__!}:~8,2!_!}:~10,2!_!}:~12,2!;!{!") Do (EndLocal
Set "{=%%~H"))
For /F "Tokens=1,* Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Group Where "Name='Administrators'" Assoc:List /ResultClass:Win32_UserAccount 2^>NUL ^| %SystemRoot%\System32\findstr.exe "^Name="') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Defined } (Set "}=%%I") Else (SetLocal EnableDelayedExpansion
For %%J In ("!}!") Do (Endlocal
Set "}=%%~J;%%I"))
Set "CSVBaseName=%{:;="&:"%"
(Echo %{%;%}%;) 1>"C:\Temp\%CSVBaseName%.csv"
如果您仍想使用 net.exe,即 'a little bit different' 不是您想要的,那么以下应该执行相同的任务:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\net.exe LocalGroup
Administrators 2^>NUL') Do (If Not Defined { (Set "{=%%G") Else (
SetLocal EnableDelayedExpansion
For /F Delims^= %%H In ("!{!") Do (EndLocal
Set "{=%%H;%%G"
Set "}=%%H"))
Set /P "=%%G" 0<NUL | %SystemRoot%\System32\findstr.exe "^\-\-*$" 1>NUL && (
Set "{="))
If Not Defined } GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\HOSTNAME.EXE'
) Do Set "{=%%G;%}%"
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get
LocalDateTime /Format:MOF 2^>NUL') Do Set "}=%%~nG"
Set "}=%}:~,4%_%}:~4,2%_%}:~6,2%__%}:~8,2%_%}:~10,2%_%}:~-2%"
(Echo %}%;%{%;) 1>"C:\Temp\%}%.csv"
与此不同的是,它不假定要跳过的特定行数,它不期望最终用户语言是英语,它使用报告的主机名,而不是计算机名,(可能不一定匹配),并且再次不依赖最终用户计算机配置来定义日期和时间字符串。
通过 cmd
在 .bat batch-file
运行 中执行此操作非常容易。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。
powershell.exe -NoLogo -NoProfile -Command ^
$DatetimeF = Get-Date -Format 'yyyy_MM_ddThh_mm_ss'; ^
$Users = (Get-LocalGroupMember -Name Administrators).Name; ^
$DatetimeF + ';' + $Env:COMPUTERNAME + ';' + ($Users -join ';') ^| ^
Out-File -FilePath ($DatetimeF + '.csv')
请帮助我将某些内容解析为 CSV。我已经知道如何使用 Powershell 来完成,但我需要使用批处理文件。
我需要得到这样的输出:
datetime;hostname;username1;username2;
其中 username1
username2
等是本地管理员组的用户名。
我做了这个:
@echo off
echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%
for /f "tokens=* skip=6" %%a in ('net localgroup Administrators') do (
echo %%a >> "c:\temp\%datetimef%.csv")
pause
然而输出文件名是:
2021_ 1_Fr__11_42_18.csv
返回的日期是:
Administrator
Usr1
The command completed successfully
如何从生成的输出文件中删除 The command completed successfully
?
我想你想要这样的东西?
@echo off
setlocal enabledelayedexpansion
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
set "var=%datetimef%"
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do set "var=!var!;%%a"
(echo %var%)>>"c:\temp\%datetimef%.csv"
谢谢大家!最后我在你的帮助下解决了这个问题:
@echo off
setlocal enabledelayedexpansion
rem set mydate=%:/date:/=%
rem set mytime=%time::=%
rem set mytimestamp=%mydate: =_%_%mytime:.=_%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
set mytimestamp=%mydate%_%mytime%
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do (
set param=!param!%%a;)
echo %mytimestamp%;%computername%;!param! >> "c:\temp\%mydate%.csv"
您报告的输出的主要问题是,它似乎假设了您的 %DATE%
和 %TIME%
变量的返回输出。这些值可以针对语言环境、机器 and/or 登录用户进行不同的配置,并且在您的情况下不匹配 dd#MM#yyyy
的 %DATE%
假设,(其中 #
代表项目分隔符)。你的显然是 ddd d#M#yyyy
、ddd dd#MM#yyyy
、ddd M#d#yyyy
。或 ddd MM#dd#yyyy
此站点上已有许多问题和答案显示使用 none 语言环境或其他配置格式获取日期和时间的方法,最有用的非 PowerShell 方法使用内置-在 WMIC.exe 实用程序中。
只是为了一些不同的东西,即根本不使用 net.exe,而是使用 WMIC.exe:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get CSName^,LocalDateTime /Format:MOF 2^>NUL') Do If Not Defined { (Set "{=%%G") Else (SetLocal EnableDelayedExpansion
Set "}=%%G"
For %%H In ("!}:~,4!_!}:~4,2!_!}:~6,2!__!}:~8,2!_!}:~10,2!_!}:~12,2!;!{!") Do (EndLocal
Set "{=%%~H"))
For /F "Tokens=1,* Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Group Where "Name='Administrators'" Assoc:List /ResultClass:Win32_UserAccount 2^>NUL ^| %SystemRoot%\System32\findstr.exe "^Name="') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Defined } (Set "}=%%I") Else (SetLocal EnableDelayedExpansion
For %%J In ("!}!") Do (Endlocal
Set "}=%%~J;%%I"))
Set "CSVBaseName=%{:;="&:"%"
(Echo %{%;%}%;) 1>"C:\Temp\%CSVBaseName%.csv"
如果您仍想使用 net.exe,即 'a little bit different' 不是您想要的,那么以下应该执行相同的任务:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\net.exe LocalGroup
Administrators 2^>NUL') Do (If Not Defined { (Set "{=%%G") Else (
SetLocal EnableDelayedExpansion
For /F Delims^= %%H In ("!{!") Do (EndLocal
Set "{=%%H;%%G"
Set "}=%%H"))
Set /P "=%%G" 0<NUL | %SystemRoot%\System32\findstr.exe "^\-\-*$" 1>NUL && (
Set "{="))
If Not Defined } GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\HOSTNAME.EXE'
) Do Set "{=%%G;%}%"
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get
LocalDateTime /Format:MOF 2^>NUL') Do Set "}=%%~nG"
Set "}=%}:~,4%_%}:~4,2%_%}:~6,2%__%}:~8,2%_%}:~10,2%_%}:~-2%"
(Echo %}%;%{%;) 1>"C:\Temp\%}%.csv"
与此不同的是,它不假定要跳过的特定行数,它不期望最终用户语言是英语,它使用报告的主机名,而不是计算机名,(可能不一定匹配),并且再次不依赖最终用户计算机配置来定义日期和时间字符串。
通过 cmd
在 .bat batch-file
运行 中执行此操作非常容易。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。
powershell.exe -NoLogo -NoProfile -Command ^
$DatetimeF = Get-Date -Format 'yyyy_MM_ddThh_mm_ss'; ^
$Users = (Get-LocalGroupMember -Name Administrators).Name; ^
$DatetimeF + ';' + $Env:COMPUTERNAME + ';' + ($Users -join ';') ^| ^
Out-File -FilePath ($DatetimeF + '.csv')