远程服务器目录,只有文件名的一部分?
Remote server DIR, only part of file name?
我想查询三个文件夹(在三个独立的服务器上)以获取客户端名称列表。
基本上,在每个文件夹中,我都有一堆 .EXE,它们的名称如下:
ClientName_ProductName.exe
从我的主服务器,我只想将 "ClientName" 部分输出到 ClientNames.txt 文件。
这是我目前所拥有的,但它正在提取所有信息(目录中的所有文件):
:: Setting the client names file
set clientnamefile="C:\ClientNames.txt"
:: Copying directory information to ClientNames.txt
dir *_ProductName.exe "\server1\c$\Program Files (x86)\Folder\" /B > %clientnamefile%
dir *_ProductName.exe "\server2\c$\Program Files (x86)\Folder\" /B >> %clientnamefile%
dir *_ProductName.exe "\server3\d$\Program Files (x86)\Folder\" /B >> %clientnamefile%
我想在 .txt 文件中包含以下内容(然后我的另一个脚本将使用该文件):
ClientName1
ClientName2
ClientName3
ClientName4
ClientName5
看看cmd中set
的帮助。这为您提供了提取部分环境变量的选项。
因此,使用第二个变量,因为我认为变量扩展不适用于循环变量,并使用字符串替换形式。
for %i in (\server1\c$\Program Files (x86)\Folder\*_ProductName.exe) set ii = %i: echo %ii:_ProductName.exe=%
(在脚本中使用 %%i
而不是 %i
。)
在 PowerShell 中可能更容易,记住 -replace
的匹配参数是正则表达式,因此需要转义句点:
dir '\server1\c$\Program Files (x86)\Folder\*_ProductName.exe' `
| % { $_.Name -replace '_ProductName\.exe', '' }
(对于脚本,我会使用完整的 cmdlet 名称而不是缩写:Get-ChildItem
和 ForEach-Object
并指定参数名称。)
在互联网的帮助下,改变了一些东西以满足我的需要,并在 MrLister 的帮助下指出了我的菜鸟语法错误,我能够让这个工作。
我现在只有一个文本文件,其中仅包含来自三个不同网络位置的 ClientName_ProductName.exe 文件的 ClientName 部分。
代码如下:
:: Setting the client names file
set textfile="C:\Util\TFProAdmin Update\ClientName_Dirty.txt"
set textfile2="C:\Util\TFProAdmin Update\ClientName.txt"
set server1="\clientimport01\c$\Program Files\Transfinder\TransfinderPro
set server2="\clientimport02\c$\Program Files (x86)\Transfinder\Routefinder Pro
set server3="\clientimport03\d$\Program Files (x86)\Transfinder\Routefinder Pro
set fileextension=*_ProductName.exe"
set searchline=_ProductName.exe
:: *********************************************************************************
:: ******************* DO !NOT! CHANGE ANYTHING BELOW THIS POINT *******************
:: *********************************************************************************
@Echo off
cls
@Echo.
@Echo *********************************************************
@Echo.
@Echo Starting client name collection process
@Echo.
@Echo *********************************************************
@Echo.
@Echo off
:: Gathering the list of _ProductName.exe files from each of the import servers and writing it to a 'dirty' (temp) text file
dir %server1%\%fileextension% /B > %textfile%
dir %server2%\%fileextension% /B >> %textfile%
dir %server3%\%fileextension% /B >> %textfile%
:: Cleaning up the original text file to remove _ProductName.exe from each line
setlocal enabledelayedexpansion
@Echo. > %textfile2%
FOR /F "usebackq delims=" %%G IN (%textfile%) DO (
Set "line=%%G" & echo !line:%searchline%=!
) >> %textfile2%
:: Deleting temporary 'dirty' text file
del %textfile%
end
我想查询三个文件夹(在三个独立的服务器上)以获取客户端名称列表。
基本上,在每个文件夹中,我都有一堆 .EXE,它们的名称如下:
ClientName_ProductName.exe
从我的主服务器,我只想将 "ClientName" 部分输出到 ClientNames.txt 文件。
这是我目前所拥有的,但它正在提取所有信息(目录中的所有文件):
:: Setting the client names file
set clientnamefile="C:\ClientNames.txt"
:: Copying directory information to ClientNames.txt
dir *_ProductName.exe "\server1\c$\Program Files (x86)\Folder\" /B > %clientnamefile%
dir *_ProductName.exe "\server2\c$\Program Files (x86)\Folder\" /B >> %clientnamefile%
dir *_ProductName.exe "\server3\d$\Program Files (x86)\Folder\" /B >> %clientnamefile%
我想在 .txt 文件中包含以下内容(然后我的另一个脚本将使用该文件):
ClientName1
ClientName2
ClientName3
ClientName4
ClientName5
看看cmd中set
的帮助。这为您提供了提取部分环境变量的选项。
因此,使用第二个变量,因为我认为变量扩展不适用于循环变量,并使用字符串替换形式。
for %i in (\server1\c$\Program Files (x86)\Folder\*_ProductName.exe) set ii = %i: echo %ii:_ProductName.exe=%
(在脚本中使用 %%i
而不是 %i
。)
在 PowerShell 中可能更容易,记住 -replace
的匹配参数是正则表达式,因此需要转义句点:
dir '\server1\c$\Program Files (x86)\Folder\*_ProductName.exe' `
| % { $_.Name -replace '_ProductName\.exe', '' }
(对于脚本,我会使用完整的 cmdlet 名称而不是缩写:Get-ChildItem
和 ForEach-Object
并指定参数名称。)
在互联网的帮助下,改变了一些东西以满足我的需要,并在 MrLister 的帮助下指出了我的菜鸟语法错误,我能够让这个工作。
我现在只有一个文本文件,其中仅包含来自三个不同网络位置的 ClientName_ProductName.exe 文件的 ClientName 部分。
代码如下:
:: Setting the client names file
set textfile="C:\Util\TFProAdmin Update\ClientName_Dirty.txt"
set textfile2="C:\Util\TFProAdmin Update\ClientName.txt"
set server1="\clientimport01\c$\Program Files\Transfinder\TransfinderPro
set server2="\clientimport02\c$\Program Files (x86)\Transfinder\Routefinder Pro
set server3="\clientimport03\d$\Program Files (x86)\Transfinder\Routefinder Pro
set fileextension=*_ProductName.exe"
set searchline=_ProductName.exe
:: *********************************************************************************
:: ******************* DO !NOT! CHANGE ANYTHING BELOW THIS POINT *******************
:: *********************************************************************************
@Echo off
cls
@Echo.
@Echo *********************************************************
@Echo.
@Echo Starting client name collection process
@Echo.
@Echo *********************************************************
@Echo.
@Echo off
:: Gathering the list of _ProductName.exe files from each of the import servers and writing it to a 'dirty' (temp) text file
dir %server1%\%fileextension% /B > %textfile%
dir %server2%\%fileextension% /B >> %textfile%
dir %server3%\%fileextension% /B >> %textfile%
:: Cleaning up the original text file to remove _ProductName.exe from each line
setlocal enabledelayedexpansion
@Echo. > %textfile2%
FOR /F "usebackq delims=" %%G IN (%textfile%) DO (
Set "line=%%G" & echo !line:%searchline%=!
) >> %textfile2%
:: Deleting temporary 'dirty' text file
del %textfile%
end